【问题标题】:how is the counter of the counter mode of AES incremented?AES的计数器模式的计数器是如何递增的?
【发布时间】: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


【解决方案1】:

每次需要加密新块(AES 是块密码)时,计数器都会增加。当您通过updatedoFinal 将数据输入Cipher 对象时,它会在内部决定当前块是否已满,并且计数器是否需要为更多块增加。

我假设您希望对相同的明文进行不同的加密以产生不同的密文。当你初始化Cipher 时,你可以传入你自己的IV(它定义了初始的内部计数器)或者根本不指定IV。省略 IV 时,它是内部随机生成的,您可以通过 Cipher#getIV 访问。

在加密完成后,调用Cipher#doFinal 会将所有内部值重置为其初始位置。当您在同一个 Cipher 实例上使用相同的数据再次调用它时,之前生成的 IV 将从头开始再次使用。如果你想要一个新的 IV,你需要重新初始化 Cipher 实例。

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); // generates an IV

byte[] encrypted = cipher.doFinal(gu.getGraine().getBytes());
System.out.println("first id : "+Base64.encodeToString(encrypted,Base64.DEFAULT));

cipher.init(Cipher.ENCRYPT_MODE, skeySpec); // generates a different IV

byte[] encrypted2 = cipher.doFinal(gu.getGraine().getBytes());
System.out.println("second id: "+Base64.encodeToString(encrypted2,Base64.DEFAULT));

请记住,稍后您需要 IV 进行解密。 IV 不应该是秘密的,只需要对于 CTR 模式是唯一的并且具有相同的密钥。当保证每次加密都会改变密钥时,IV 可以设置为静态值。

【讨论】:

  • 感谢您的回答,是的,我希望对相同的明文进行不同的加密以产生不同的密文。因此,如果我对我的问题理解正确,我必须每次生成一个新的 IV 有不同的加密数据?
  • 没错,如果您不生成新的 IV,那么您的密文机密性就会发生灾难性的破坏,因为您手上有一个 many-time pad
  • 所以我应该避免对两个不同的字符串使用相同的 Iv 和相同的键?所以让我们假设我必须从几个字符串创建 4 种不同的加密形式。我可以创建 4 个 Iv 以供所有链重复使用吗?
  • 不知道你所说的链是什么意思。如果您重用 IV,那么攻击者可以访问两个密文(不同的明文,但相同的 IV 和相同的密钥),那么他们能够看到两个明文之间的 XOR 差异。如果他们知道其中一个明文的一部分,那么他们就知道另一个明文的相同部分。如果明文遵循某种模式,那么他们甚至可以通过观察异或差异来推断出更多的明文。重复使用 IV 的次数越多,这种扣除就越容易。
猜你喜欢
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2013-03-27
  • 2017-05-18
相关资源
最近更新 更多