我正在使用 AES 256 CBC。我有 32 个字节的 IV。但是当我运行它时,它显示了一个异常:

Exception in thread "main" java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
    at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:50)
    at com.abc.aes265cbc.Security.main(Security.java:48)Caused by: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
    at com.sun.crypto.provider.CipherCore.init(CipherCore.java:430)
    at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:217)
    at javax.crypto.Cipher.implInit(Cipher.java:790)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:848)
    at javax.crypto.Cipher.init(Cipher.java:1347)
    at javax.crypto.Cipher.init(Cipher.java:1281)
    at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:47)
    ... 1 more

我不知道如何解决这个问题。我搜索了但我不知道如何解决这个问题。我是第一次尝试安全概念。 我的 AES 256 CBC 代码是:

 public static void setENCRYPTION_IV(String ENCRYPTION_IV) {
        AESUtil.ENCRYPTION_IV  =   ENCRYPTION_IV;
    }    public static void setENCRYPTION_KEY(String ENCRYPTION_KEY) {
        AESUtil.ENCRYPTION_KEY  =   ENCRYPTION_KEY;
    }    public static String encrypt(String src) {        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, makeKey(), makeIv());            return Base64.encodeBytes(cipher.doFinal(src.getBytes()));
        } catch (Exception e) {            throw new RuntimeException(e);
        }
    }    public static String decrypt(String src) {        String decrypted = "";        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, makeKey(), makeIv());
            decrypted = new String(cipher.doFinal(Base64.decode(src)));
        } catch (Exception e) {            throw new RuntimeException(e);
        }        return decrypted;
    }    static AlgorithmParameterSpec makeIv() {        try {            return new IvParameterSpec(ENCRYPTION_IV.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }        return null;
    }    static Key makeKey() {        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] key = md.digest(ENCRYPTION_KEY.getBytes("UTF-8"));            return new SecretKeySpec(key, "AES");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }        return null;
    }

你能帮我改变这段代码中的内容吗,我将能够使用 32 字节的 IV。 提前致谢

编辑: 我调用此函数的主要函数:

 AESUtil.setENCRYPTION_KEY("96161d7958c29a943a6537901ff0e913efaad15bd5e7c566f047412179504ffb");    AESUtil.setENCRYPTION_IV("d41361ed2399251f535e65f84a8f1c57");    String decrypted = AESUtil.decrypt(new String(sw0SrUIKe0DmS7sRd9+XMgtYg+BUiAfiOsdMw/Lo2RA=));   // AES Decrypt

最佳答案

AES 算法的 block 大小为 128 位,无论您的 key 长度是 256、192 还是 128 位。

当对称密码模式需要 IV 时,IV 的长度必须等于密码的 block 大小。因此,对于 AES,您必须始终使用 128 位(16 字节)的 IV。

AES 无法使用 32 字节的 IV。

关于java – 想要使用 32 字节的 AES 256 CBC 但它显示 java.security.InvalidAlgorithmParameterException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13467343/

转自“https://www.coder.work/article/1339964”