上篇用Java實作了SM4的PKCS7Padding填充模式,本篇是對填充後的還原。
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());
}
}