在 与CTR模式需要注意的是,你 使用相同的密钥重新使用相同的计数器值。如果这样做,您实际上已经放弃了纯文本。
为了解决这个问题,在CTR模式的一些实际实现中,将传递给块密码的块分为两部分,分别标记为IV和计数器(而不是将整个对象称为计数器)。IV是随机生成的,并且计数器从0开始。
只要您从不重复使用“ IV”部分,就可以从零开始将“计数器”部分用于多个消息。
请注意,尽管这只是一个标签约定。从数学上讲,这与将整个事物称为“计数器”相同,并且对于每条消息,计数器以某个整数的随机倍数启动。
我不确定Bouncy Castle实施具体如何工作- 也许是让您使用该IV
值设置整个初始块,计数器以及全部。如果不提供一个,显然会为您生成一个明智的IV,这就是为什么在相同输入下获得不同输出的原因。最重要的是,这是好的 ,而正是您想要的-提供全零是 不好的 ,而不是您想要的。