Java AES计数器模式的计数器如何递增?

Java AES计数器模式的计数器如何递增?,java,encryption,aes,counter,Java,Encryption,Aes,Counter,你好,我的英语坏了,请提前道歉。 我想在一个项目中实现几个不同的加密字符串 因此,我转向AES的计数器模式(我已经在python中毫无问题地使用了该模式) 但是当我在同一个字符串上使用下面的程序两次时,结果是完全相同的。 我可能不明白AES是如何工作的。但我想知道计数器是否自行递增 我试着使用静脉注射,但我必须自己增加注射量才能得到不同的结果吗 下面是一个示例代码: String key = "thisisa128bitkey"; Cipher cipher = Ciphe

你好,我的英语坏了,请提前道歉。 我想在一个项目中实现几个不同的加密字符串

因此,我转向AES的计数器模式(我已经在python中毫无问题地使用了该模式)

但是当我在同一个字符串上使用下面的程序两次时,结果是完全相同的。 我可能不明白AES是如何工作的。但我想知道计数器是否自行递增

我试着使用静脉注射,但我必须自己增加注射量才能得到不同的结果吗

下面是一个示例代码:

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()是一个简单的字符串。 用于显示这两个值​​相同


提前感谢您的时间。

每次需要加密新块(AES是一种块密码)时,计数器都会递增。当您通过
update
doFinal
将数据馈送到
Cipher
对象时,它会在内部决定当前块是否已满,并且需要为进一步的块增加计数器

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

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

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,这将是密文机密性的灾难性破坏,因为你手上有一个。所以我应该避免对两个不同的字符串使用相同的IV和相同的密钥?让我们想象一下,我必须从几个字符串中创建4种不同的加密形式。我可以创建4 Iv,我将重复使用所有的链吗?不知道你所说的链是什么意思。如果您重用一个IV,那么访问这两个密文(不同的明文但相同的IV和相同的密钥)的攻击者就可以看到这两个明文之间的异或差异。如果他们知道其中一个明文的一部分,那么他们知道另一个明文的相同部分。如果明文遵循某种模式,那么他们甚至可以通过观察异或差异来推断出更多的明文。重复使用IV的频率越高,这种推导就越容易。我希望对同一明文进行不同的加密,以产生不同的密文。我想我用的是坏技术。但是在python上,在对字符串进行每次加密之后,对该字符串进行新的加密会在计数器模式下给出不同的结果。我想把代码从Python复制到java。这种技术允许我从我看到的同一条字符串中生成几个临时标识符。如果未存储IV,则无法再次从字符串中重新创建标识符。然后,您必须以某种方式存储或传输临时标识符以使其有用。在这种情况下,您只需随机生成一个标识符,而无需任何加密。如果您不需要解密它,那么哈希或HMAC也可能是您的解决方案,但这也是确定性的。我需要稍后对其进行解密,因此,如果我存储4个不同的Ivs,我可以在其他字符串上重复使用Ivs而不遇到关键问题吗?