上篇用Java实现了SM4的PKCS7Padding填充模式,本篇是对填充后的还原。
/**
* PKCS5Padding填充模式还原
* 将数组拆分两部分,还原最后16字节的数组后再重新组合
* @param array
* @return
*/
public static byte[] PKCS7PaddingRestore(byte[] paramArray) throws Exception {
if (isEmpty(paramArray)) {
throw new Exception("数据异常,字节填充还原错误,参数为空!");
}
try {
// 定义是否需要消除填充数据
boolean needRestore = true;
int length = paramArray.length;// 获取字符串长度
// 拆分并获取最后一组16倍数数值
byte[] paramByteLast = Arrays.copyOfRange(paramArray, length - 16, length);
// 获取最后一个字节
byte byteLast = paramByteLast[paramByteLast.length - 1];
// 开始填充字节位置
int paddingNum = paramByteLast.length - byteLast;
if (paddingNum > 0) {
// 判断数组字节位数的字节是否与最后字节相等
for (int i = paddingNum; i < paramByteLast.length; i++) {
byte paramSon = paramByteLast[i];
if (byteLast != paramSon) {
needRestore = false;
}
}
} else {
needRestore = false;
}
if (needRestore) {
// 组合新数组并返回
byte[] resultArray = Arrays.copyOfRange(paramArray, 0, length - byteLast);
return resultArray;
}
return paramArray;
} catch (Exception e) {
throw new Exception("数据异常,字节填充还原错误,异常抛出!" + e.getMessage());
}
}