首页 > 解决方案 > 解密失败 使用填充密码解密时,输入长度必须是 16 的倍数

问题描述

尝试解密我的加密消息时,使用填充密码解密时出现错误输入长度必须是 16 的倍数。

我加密的是这样的:

{
    "guid": "d123-231s-2314w123-21312-2312312",
    "userid": "000123",
    "channel": "TESTINGCHANNELTEST"
}

但是当我解密它时,我得到了那个错误。但是当我解密这条消息时

{
    "guid": "00",
    "userid": "00",
    "channel": "TEST"
}

有用。

是什么造成了这个问题?这是我的加密和解密代码:

public class EncryptDecryptModel {

        private static final String key = "aesEncryptionKey";
        private static final String initVector = "encryptionIntVec";

        public static String encrypt(String value) {
            try {
                IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
                SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

                byte[] encrypted = cipher.doFinal(value.getBytes());
                return Base64.encodeBase64String(encrypted);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;
        }

        public static String decrypt(String encrypted) {
            try {
                IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
                SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
                byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
                //original = Base64.decodeBase64(encrypted);

                return new String(original);
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            return null;
        }

这是为了加密:

@PostMapping("/getEncrypt")
public String getEncrypt(@RequestBody OpenMediaModel openMediaModel) throws UnsupportedEncodingException, InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
    EncryptDecryptModel encryptDecryptModel=new EncryptDecryptModel();
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    String message = openMediaModel.getGuid() + "|" + openMediaModel.getCif()
            + "|" + openMediaModel.getChannel();
    byte[] encodedhash = digest.digest(
            message.getBytes(StandardCharsets.UTF_8));
    message = message + "|" + new String(encodedhash);
    return  encryptDecryptModel.encrypt(message);
}

这就是我解密消息的方式:

 @GetMapping("/getDecrypt")
    public String getDecrypt(@RequestParam String encrypt) throws NoSuchPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, InvalidKeyException {
        EncryptDecryptModel encryptDecryptModel=new EncryptDecryptModel();
        String plainMessage = encryptDecryptModel.decrypt(encrypt);
        String[] splitMessage = plainMessage.split("\\|");
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        String message = splitMessage[0] + "|" + splitMessage[1]
                + "|" + splitMessage[2];

        //byte[] encodedhash = digest.digest(
          //      message.getBytes(StandardCharsets.UTF_8));

        //return new String(encodedhash).equals(splitMessage[3]);
        return splitMessage[0]+"-"+splitMessage[1]+"-"+splitMessage[2];
    }

问题是当我像第一个那样放置长 json 格式时,出现异常:

javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 16 的倍数

对不起,这是我第一次做这个加密。所以当我解密长消息时不知道。因为当我发短信时它工作得很好。我尝试使用 decodeBase64 但没有价值需要帮助。

提前致谢。

标签: javaspring-bootencryption

解决方案


推荐阅读