【发布时间】:2021-02-06 19:54:30
【问题描述】:
当我使用默认的 AES/GCM 算法初始化 Cipher 对象时,它有一个随机的 12 字节 IV,但在调用 doFinal 后前 4 个字节没有增加并抛出 java.lang.IllegalStateException: Cannot重复使用相同的密钥和 IV 进行多次加密例外。
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();
【问题讨论】:
-
你的问题是什么?你想完成什么?
-
也许我在滥用密码。我不明白如果它不增加,为什么它使用 12 字节 IV 而不是 16。我必须使用相同的 256 位密钥加密一个大文件,并将其分块并自动增加随机数的计数器。
-
为什么不对每个块使用随机 IV?如果块是独立的,那么您可以使用不同的 IV。如果不是,请先加密一次,然后再分块
-
请查看@Maarten Bodewes 对此主题的回答:crypto.stackexchange.com/a/41610/50189。 IV/nonce 长度建议为 96 位/12 字节是 a) 与其他程序的兼容性和 b) 任何其他长度都需要重新计算新的(内部)。
-
加密后无法拆分,因为密文会一直保存在内存中直到最后,如果文件很大会因为内存不足而抛出异常。
标签: java android security encryption aes-gcm