AES 256位加密 - java.security.InvalidAlgorithmParameterException:错误的IV长度:必须是16个字节长 [英] AES 256 bit encryption - java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long

查看:5463
本文介绍了AES 256位加密 - java.security.InvalidAlgorithmParameterException:错误的IV长度:必须是16个字节长的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的加密逻辑。虽然我的IV是16字节长,但我仍然会收到无效IV长度的错误。非常感谢任何帮助

Below is my encryption logic. Although my IV is 16bytes long, I still get an error with invalid IV length. Would appreciate any help

@Override
public String encrypt(String dataToEncrypt, String IV) throws Exception{
    if(encryptionKey.length() < 10){
        encryptionKey = generateEncryptionKey().toString();
    }
    System.out.println("number of IV bytes is "+IV.length()+" "+IV);
    Cipher cipher = Cipher.getInstance(encrpytionAlgo);
    SecretKey key = new SecretKeySpec(encryptionKey.getBytes(Charset.forName("UTF-8")), "AES");
    cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes(Charset.forName("UTF-8"))));
    byte[] encryptedTextBytes = cipher.doFinal(dataToEncrypt.getBytes(Charset.forName("UTF-8")));
    return new Base64().encodeAsString(encryptedTextBytes);
}

IV和密钥生成逻辑

 @Override
public String generateRandomIV(){
        Random random = new SecureRandom();
        byte[] iv = new byte[16];
        random.nextBytes(iv);
        System.out.println("IV is "+Base64.encodeBase64(iv)+" "+ com.sun.jersey.core.util.Base64.base64Decode(new String(Base64.encodeBase64(iv)))+ " number of bytes is "+iv.length);
        return new String(Base64.encodeBase64(iv));
}

@Override
public SecretKey generateEncryptionKey(){
    KeyGenerator aesKey = null;
    try {
        aesKey = KeyGenerator.getInstance("AES");
    } catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
    }
    aesKey.init(256);
    SecretKey secretKey = aesKey.generateKey();
    System.out.println("Encryption key is "+ new Base64().encode(secretKey.getEncoded()));
    return secretKey;
}

以下是异常的堆栈跟踪
异常是在行:

cipher.init(密码,新的IvParameterSpec(IV.getBytes(Charset.forName(UTF-8))));

Below is the stacktrace for the exception Exception is at line :
cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes(Charset.forName("UTF-8"))));

java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineInit(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at com.intuit.platform.publiccloudaccess.core.services.EncryptionServiceImpl.encrypt(EncryptionServiceImpl.java:47)


推荐答案

您在从 generateRandomIV 返回之前将IV编码为Base64。在将其用于加密和解密之前,您必须对其进行解码。

You encoded your IV as Base64 before returning it from generateRandomIV. You have to decode it before using it for encryption and decryption.

cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(java.util.Base64.Decoder.decode(IV.getBytes("UTF-8"))));

Java 8提供 java.util.Base64 用于获取不同Base 64编码器和解码器的类。

Java 8 provides the java.util.Base64 class for getting different Base 64 encoders and decoders.

这篇关于AES 256位加密 - java.security.InvalidAlgorithmParameterException:错误的IV长度:必须是16个字节长的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆