【发布时间】:2021-05-16 16:54:30
【问题描述】:
您好,提前为我的英语不好表示抱歉。 我想在一个项目中从一个字符串中实现几种不同的加密。
所以我转向了AES的计数器模式(我已经在python中使用过,没有任何问题)
但是当我在同一个字符串上两次使用下面的程序时,结果是完全一样的。 我可能不明白 AES 是如何工作的。但我想知道计数器是否会自行增加。
我尝试使用 Iv,但我必须自己增加它以获得不同的结果吗?
这是一个示例代码:
String key = "thisisa128bitkey";
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(gu.getGraine().getBytes());
System.out.println("first id : "+Base64.encodeToString(encrypted,Base64.DEFAULT));
byte[] encrypted2 = cipher.doFinal(gu.getGraine().getBytes());
System.out.println("second id: "+Base64.encodeToString(encrypted2,Base64.DEFAULT));
这里 gu.getGraine() 是一个简单的字符串。 为了显示这两个值是相同的
提前感谢您的宝贵时间。
【问题讨论】:
-
我希望对同一明文进行不同的加密以产生不同的密文。我想我正在使用糟糕的技术。但是在 python 上,在对字符串进行每次加密之后,对该字符串进行新的加密会在计数器模式下给出不同的结果。我想将代码从 Python 复制到 java。这种技术允许我从同一个字符串生成几个临时标识符
-
我明白了。如果您不存储 IV,则无法再次从字符串重新创建标识符。然后,您必须以某种方式存储或传输临时标识符以使其有用。在这种情况下,您可以只随机生成一个标识符,而无需任何加密。如果您不需要解密它,那么散列或 HMAC 也可能是您的解决方案,但这也是确定性的。
-
我需要稍后解密它,所以如果我存储 4 个不同的 Iv,我可以在其他字符串上重复使用 Iv 而不会遇到严重问题吗?
标签: java encryption aes counter