据我所知,点击率模式不使用初始向量。它只需要一个计数器,用给定的密钥对其进行加密,然后将结果与明文进行XOR运算以得到密文。
其他分组密码模式(例如CBC)在进行加密之前,会将明文与初始向量进行异或。
所以这是我的问题。我在Java中有以下代码(使用bouncycastle库):
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal("Some plaintext");
使用相同的键对上述代码进行的每个不同调用都会产生不同的输出!但是在做的时候:
byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, key, IV); byte[] result = cipher.doFinal("Some plaintext");
在上述代码的每次调用中,我都会得到相同的结果。但是为什么呢?我的意思是,点击率不需要IV,那么为什么当我在每次通话中都不给出IV时却得到不同的结果,而当我给出IV时它返回相同的结果呢?如果我在使用点击率时总是使用上述IV(全零),那会安全吗?
任何想法都将非常有帮助。谢谢
在 最重要的 与CTR模式需要注意的是,你 永远不会 使用相同的密钥重新使用相同的计数器值。如果这样做,您实际上已经放弃了纯文本。
为了解决这个问题,在CTR模式的一些实际实现中,将传递给块密码的块分为两部分,分别标记为IV和计数器(而不是将整个对象称为计数器)。IV是随机生成的,并且计数器从0开始。
只要您从不重复使用“ IV”部分,就可以从零开始将“计数器”部分用于多个消息。
请注意,尽管这只是一个标签约定。从数学上讲,这与将整个事物称为“计数器”相同,并且对于每条消息,计数器以某个整数的随机倍数启动。
我不确定Bouncy Castle实施具体如何工作- 也许是让您使用该IV值设置整个初始块,计数器以及全部。如果不提供一个,显然会为您生成一个明智的IV,这就是为什么在相同输入下获得不同输出的原因。最重要的是,这是 好的 ,而正是您想要的-提供全零是 不好的 ,而不是您想要的。
IV