当前位置: 首页 > 面试题库 >

需要解决AES中IV长度错误的问题

严欣怡
2023-03-14
问题内容

我正在尝试用Java实现AES,这是我使用的代码:

 byte[] sessionKey = {00000000000000000000000000000000};
 byte[] iv = {00000000000000000000000000000000};
 byte[] plaintext = "6a84867cd77e12ad07ea1be895c53fa3".getBytes();
 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

 cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
 byte[] ciphertext = cipher.doFinal(plaintext);

 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
 byte[] deciphertext = cipher.doFinal(ciphertext);

我需要此固定密钥和IV进行测试,但出现以下异常:

Exception in thread "main"
java.security.InvalidAlgorithmParameterException: 
  Wrong IV length: must be 16 bytes long    at
com.sun.crypto.provider.SunJCE_h.a(DashoA12275)     at
com.sun.crypto.provider.AESCipher.engineInit(DashoA12275)   at
javax.crypto.Cipher.a(DashoA12275)  at
javax.crypto.Cipher.a(DashoA12275)  at
javax.crypto.Cipher.init(DashoA12275)   at
javax.crypto.Cipher.init(DashoA12275)

如何在此AES实现中使用固定的IV?有什么办法吗?


问题答案:

首先,

byte[] iv = {00000000000000000000000000000000};

创建一个大小为1的字节数组,而不是大小为32的字节数组(如果您打算这样做)。

其次,AES的IV大小应为16字节或128位(这是AES-128的块大小)。如果使用AES-256,则IV大小应为128位大,因为AES标准仅允许128位块大小。原始的Rijndael算法允许其他块大小,包括256位长的块大小。

第三,如果您打算使用AES-256,则不要开箱即用。您需要下载并安装JCE无限强度管辖权策略文件(滚动到页面底部);我还建议您阅读随附的许可证。

这将对您的代码进行以下更改:

byte[] iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

最后,初始化向量是唯一且不可预测的。一个16字节的序列(每个字节由0表示)不适合用于IV。如果这是生产代码,请考虑寻求帮助。



 类似资料:
  • 问题内容: 我正在编写一个简单的应用程序,以使用AES / CBC(模式)对我的消息进行加密。据我了解,CBC模式需要IV参数,但我不知道为什么我的代码在不使用IV参数的情况下也能工作。任何人都可以解释为什么?谢谢。 打印的加密消息:T9KdWxVZ5xStaisXn6llfg ==毫无例外。 问题答案: 不带IV使用时,对于包括AES在内的某些类型的密码,它将隐式使用0 IV。请参阅Cipher

  • 问题内容: 此代码给出了无效的AES密钥长度错误。我该如何纠正?(我想要128位密钥AES加密) 任何帮助表示赞赏 问题答案: 使用a 从密码派生密钥字节。您可以在此处查看详细示例。请注意,您需要指定128位密钥的密钥长度,而不是该示例中所示的256位。 您将遇到的下一个问题是您没有指定填充方案。除非您的消息是16字节(AES块大小)的倍数,否则将引发错误。如示例所示,使用PKCS5Padding

  • 问题内容: 我正在研究 文本加密和解密 项目(遵循Struts 2) 每当我输入密码和纯文本时,都会收到“无效的AES密钥长度”错误。 服务等级 这是错误 问题答案: 一般须知: 键!=密码 需要键,而不是密码。见下文 这可能是由于策略限制导致无法使用32个字节的密钥。看到其他答案 就你而言 问题是数字1:您要传递密码而不是密钥。 AES仅支持16、24或32字节的密钥大小。您要么需要提供准确的金

  • 我正在使用android Studio学习应用程序开发。 在build.gradle页面上,我遇到了一个错误,即 “编译'com.android.support:appcompat-v7:25.2.0'”

  • 我已经尝试了在不同的包中添加类的各种可能的方法,比如在包com.packageName中添加应用程序类,在不同的包名model中添加控制器,当我试图执行程序时,它返回默认的白标签错误,当我将这些类放在同一个包中时,它成功地运行。 所以我想问是否有任何问题与项目或我需要给出任何路径。之前,我也尝试过表示组件扫描的符号,除了to之外,其他都没有用到

  • 问题内容: 我在下面的(E.1)中使用它来进行我的应用程序,显然我认识并理解了其中的一个巨大的安全漏洞。我对加密越来越感兴趣,并且想更好地理解它,我需要随IV一起生成一个随机密钥,但是不确定如何正确地执行此操作。有人可以向我解释一下熟悉AES加密的工作原理(IV和KEY)吗? )因此,我将来能够更好地理解并可以运用我的知识,本质上,我只是想使代码更安全,谢谢。 (E.1) 问题答案: AES密钥仅