2017-02-14 366 views
2

我试图用AES解密一些数据。我已经拥有一个256位密钥和16字节IV这样的:JAVA AES 256解密

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它说:Cannot find any provider supporting AES/CBC/PKCS7PADDING

如果我用AES/CBC/PKCS5PADDING我得到Illegal key size但我检查,关键尺寸为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; 
} 

回答

3

如果您通过AES-256获得IllegalKeySize例外,请检查以确保您的活动JVM中安装了JCE Unlimited Cryptographic Strength Policy files。对于任何超过128 bits的AES密钥长度,它们都是必需的。

(PKCS#7填充方案是effectively equivalent to PKCS #5 in Java(块大小在规范中定义的不同),但Java从未添加的PKCS#7名的名单,因此使用PKCS5Padding是正确的。)

+0

感谢您的澄清,这解决了这个问题。很有趣,我们的生产环境确实包含了很多其他人所报道的这些库。生产中的差异在于使用OpenJDK vs使用Oracle的开发。 –

-1

您需要使用充气城堡作为PKCS7PADDING供应商。

+0

在这种情况下,PKCS5只是一个命名问题,当AES添加到DES代码时,名称未更新为PKCS7。这两个名称都适用于所有意图和目的。 – zaph

1

首先看到的@Andy回答。

如果您收到“非法密钥大小”错误,那么密钥大小不正确,您需要通过调试找出原因。创建为UTF-8键

byte[] keyBytes = key.getBytes("UTF-8") 

一个变量,其显示为十六进制,这样你可以清楚地看到它发生。

内联转换本质上不可调试。

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

PKCS#7 padding

PKCS#5填充相同PKCS#7填充,不同之处在于它仅被用于使用一个64位(8字节)的块大小的块密码定义。在实践中,两者可以互换使用。