一尘不染

CTR模式使用初始向量(IV)

java

据我所知,点击率模式不使用初始向量。它只需要一个计数器,用给定的密钥对其进行加密,然后将结果与明文进行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(全零),那会安全吗?

任何想法都将非常有帮助。谢谢


阅读 648

收藏
2020-12-03

共1个答案

一尘不染

最重要的 与CTR模式需要注意的是,你 永远不会 使用相同的密钥重新使用相同的计数器值。如果这样做,您实际上已经放弃了纯文本。

为了解决这个问题,在CTR模式的一些实际实现中,将传递给块密码的块分为两部分,分别标记为IV和计数器(而不是将整个对象称为计数器)。IV是随机生成的,并且计数器从0开始。

只要您从不重复使用“ IV”部分,就可以从零开始将“计数器”部分用于多个消息。

请注意,尽管这只是一个标签约定。从数学上讲,这与将整个事物称为“计数器”相同,并且对于每条消息,计数器以某个整数的随机倍数启动。

我不确定Bouncy Castle实施具体如何工作-
也许是让您使用该IV值设置整个初始块,计数器以及全部。如果不提供一个,显然会为您生成一个明智的IV,这就是为什么在相同输入下获得不同输出的原因。最重要的是,这是
好的 ,而正是您想要的-提供全零是 不好的 ,而不是您想要的。

2020-12-03