当前位置: 首页 > 知识库问答 >
问题:

Java aes/gcm/nopadding加密在doFinal之后不增加IV的计数器

杨起运
2023-03-14

当我用默认的AES/GCM算法初始化一个密码对象时,它有一个reandom 12字节IV但是前4字节没有得到增量,因此调用final并抛出java.lang.IllegalStateException:不能重用相同的密钥和IV for multiple encryptions异常。

SecretKey secretKey = ...

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);

byte[] iv1 = encCipher.getIV();
byte[] ctext = encCipher.doFinal("a".getBytes());
      
cipher.update("b".getBytes());
byte[] iv2 = encCipher.getIV();
ctext = encCipher.doFinal();

共有1个答案

文德曜
2023-03-14

IllegalStateException:不能在多个加密中重用相同的密钥和IV异常。

这是为了保护您,希望库至少在同一密码对象下使用时保留此行为。

AES-GCM内部在CTR模式下使用AES进行加密,而对于CTR模式,(key,IV)对的重用是由于婴儿床拖动造成的保密性的灾难性失败。

if len(IV) = 96 then 
    J_0 = IV || 0^{31}1
else 
    J_0=GHASH_H(IV||0^{s+64}||len(IV_64))
  • 另外,请查看正确使用AES-GCM的规则是什么?
  • 当标记不正确时,不要使用明文。
  • 有一个AES-GCM-SIV模式,可以消除(IV,key)对的误用。它只泄露了在相同的IV和密钥下再次发送相同的消息。
  • TLS实际上对每个记录使用一个新的(键,IV)对,最多2^14字节,这样可以防止内存填充攻击。假设您花费了68GB的内存解密,那么您已经看到标记是不正确的。服务器的DOS攻击点不错。
  • 使用ChaCha20-Poly1305比可用的AES-GCM容易得多。不过,它仍然存在(IV,key)重用问题。
  • 有一个XChaCha20使用192位nonce和64位计数器。可以安全地处理非常大的数据大小和随机错误。
 类似资料:
  • 我在加密过程中尝试了以下选项: 但这会引发以下错误:

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

  • 我在下面(E.1)中使用它作为我的应用程序,显然有一个我认识和理解的巨大的明显的安全漏洞。我对加密越来越感兴趣,想更好地理解它,我需要生成一个随机密钥和一个IV,但不确定如何正确地执行。有人能向我解释一下熟悉AES加密的人是如何工作的吗? (E.1)

  • 我有一个应用程序,需要在配置文件中存储一些秘密密码,如数据库和ftp密码/详细信息。我环顾四周,发现了许多使用AES的加密/解密解决方案,但我似乎不知道如何在不改变密钥的情况下使其工作。这意味着我可以加密和解密(使用相同的秘密密钥),但在重启等过程中保持持久性。我似乎无法让秘密钥匙保持不变。下面的示例显示了我的工作方法: 到目前为止还不错。然而,如果我运行它一次,我可能会得到'2Vhht/L80U