JAVA AES 256解密

JAVA AES 256解密,java,encryption,cryptography,aes,Java,Encryption,Cryptography,Aes,我想用AES解密一些数据。我得到了256位密钥和16字节IV,如下所示: String key = "Hh1s1f4T2mpN3yCh4ngeL8t3r\\.Thxpp"; int[] v = {11, 1, 555, 222, 241, 21, 11, 33, 35, 91, 45, 6, 14, 30, 22, 234}; String IV = Arrays.toString( v ); 我被告知填充应该是PKCS7,但当我用AES/CBC/PKCS7PADDING初始化

我想用AES解密一些数据。我得到了256位密钥和16字节IV,如下所示:

  String key = "Hh1s1f4T2mpN3yCh4ngeL8t3r\\.Thxpp";

  int[] v = {11, 1, 555, 222, 241, 21, 11, 33, 35, 91, 45, 6, 14, 30, 22, 234};

  String IV = Arrays.toString( v );
我被告知填充应该是PKCS7,但当我用
AES/CBC/PKCS7PADDING
初始化密码时,它会说:
找不到任何支持AES/CBC/PKCS7PADDING的提供者

如果我使用
AES/CBC/PKCS5PADDING
我会得到
非法密钥大小
,但我已经检查了密钥大小是否为32

  public static String decrypt(String key, String initVector, String encrypted) {
    try {
        System.out.println( "Key size: " + key.getBytes("UTF-8").length ); 

        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));

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

    return null;
 }

您需要使用bouncy castle作为PKCS7PADDING的提供程序。

如果您在
AES-256
中遇到
IllegalKeySize
异常,请检查以确保在活动JVM中安装了。超过
128位的任何AES密钥长度都需要它们


(PKCS#7填充方案为(块大小在规范定义中不同),但Java从未将PKCS#7名称添加到其列表中,因此使用
PKCS5Padding
是正确的。)

首先查看@Andy的答案

如果出现“非法密钥大小”错误,则密钥大小不正确,需要通过调试找出原因。为UTF-8键创建一个变量

byte[] keyBytes = key.getBytes("UTF-8")
并将其显示为十六进制,这样您就可以准确地看到它发生了什么

内联转换基本上不可能调试

PKCS#5填充是PKCS#7填充的一个子集,在每种情况下都是相同的,PKCS#5只是懒惰的开发人员从DES保留下来的名称

:

PKCS#5填充与PKCS#7填充相同,只是它仅为使用64位(8字节)块大小的块密码定义。实际上,两者可以互换使用


在本例中,PKCS5只是一个命名问题,当AES添加到DES代码时,名称未更新为PKCS7。这两个名字的意图和用途都是一样的。感谢您的澄清,这就解决了问题。有趣的是,我们的生产环境确实包含了这些库,就像其他人报道的那样。不同之处在于,生产使用的是OpenJDK,而开发使用的是Oracle。