JAVA AES 256 Decrypt

时间:2017-02-14 20:52:16

标签: 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 );

我被告知padding应该是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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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字节)块大小的块密码定义。在实践中,这两者可以互换使用。

答案 2 :(得分:-1)

您需要使用充气城堡作为PKCS7PADDING的提供者。