【问题标题】:Exception in thread "main" java.security.InvalidKeyException: Illegal key size. char length of key is 44线程“主”java.security.InvalidKeyException 中的异常:非法密钥大小。键的字符长度为 44
【发布时间】:2020-05-06 21:33:35
【问题描述】:

线程“主”java.security.InvalidKeyException 中的异常:以下代码的密钥大小非法

密钥的字符长度是 44。我尝试使用字符长度 24 能够加密。请帮助如何解决此问题。


public static void main(String args[]) throws Exception {
    String plainText = "Hello world!";
    String encryptionKeyBase64 = "DWIzFkO22qfVMgx2fIsxOXnwz10pRuZfFJBvf4RS3eY=";
    System.out.println(encryptionKeyBase64.length());
    String ivBase64 = "AcynMwikMkW4c7+mHtwtfw==";
    EncDec encDec = new EncDec();
    String cipherText = encDec.encrypt(plainText, encryptionKeyBase64, ivBase64);
}

 public String encrypt(String plainText, String keyBase64, String ivBase64) throws Exception
    {
        byte[] plainTextArray = plainText.getBytes(StandardCharsets.UTF_8);
        byte[] keyArray = DatatypeConverter.parseBase64Binary(keyBase64);
        byte[] iv = DatatypeConverter.parseBase64Binary(ivBase64);

        SecretKeySpec secretKey = new SecretKeySpec(keyArray, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");   
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
        return new String(DatatypeConverter.printBase64Binary(cipher.doFinal(plainTextArray)));
    }

    public String decrypt(String messageBase64, String keyBase64, String ivBase64) throws Exception {

        byte[] messageArray = DatatypeConverter.parseBase64Binary(messageBase64);
        byte[] keyArray = DatatypeConverter.parseBase64Binary(keyBase64);
        byte[] iv = DatatypeConverter.parseBase64Binary(ivBase64);

        SecretKey secretKey = new SecretKeySpec(keyArray, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
        return new String(cipher.doFinal(messageArray));
    }
}```

【问题讨论】:

    标签: java


    【解决方案1】:

    由于您使用“AES”作为加密方案,因此 SecretKeySpec 输入中的密钥长度必须为 16、24 或 32 个字节。

    因此,您应该检查 byte[] keyArray 的长度,而不是字符串“encryptionKeyBase64”的长度,并确保它的长度为 16/24/32 字节。

    你可以添加行

    System.out.println("keyArray.length: " + 
    DatatypeConverter.parseBase64Binary(encryptionKeyBase64).length);
    

    在您在加密/解密方法中使用它之前。

    顺便说一句:初始化向量“iv”的长度必须为 16 个字节(固定,与密钥长度无关)。您可以使用

    轻松检查
    System.out.println("iv.length:       " + DatatypeConverter.parseBase64Binary(ivBase64).length);
    

    【讨论】:

    • 嗨迈克尔,我尝试了你的建议,密钥长度为 32,IV 长度也是 16。但我仍然看到问题,请你告诉我哪里出错了。感谢您早点回复。
    • 看起来您使用的是过时的 java 版本,因为当您使用的 Java 版本不允许 16 以外的 AES 密钥长度时,也会引发“非法密钥大小”错误。现在有三个选择:1)使用大小为 16 字节长的密钥或 2)更新您的 Java,例如最低 Java 6u181、7u171、8u161、9b148 或 3)您从 Oracle 的 Java 站点安装“无限强度管辖策略文件”。我更喜欢选项 2。你可以在这里找到很多问答,例如stackoverflow.com/questions/41580489/….
    • 这在更新我的 Java 版本后工作。但是我现在有一个问题,我想在 datapower 中解密的加密值。哪个不能。有没有办法让它在 datapower 中工作。谢谢
    • 感谢迈克尔的所有支持。我想出了一种在 Java 中加密并在 dataoower 中解密的方法
    猜你喜欢
    • 2011-10-17
    • 2013-11-20
    • 2012-06-05
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多