天天看点

java实现SM4 PKCS7Padding填充模式的还原

上篇用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());

        }

    }