据我所知,CTR的工作方式是:获取一个计数器,将它与一个nonce连接起来,并对结果进行加密,从而使XORed进入密文。用于128位分组密码(即。),我的理解是CTR块的前8个字节是现在,下半个字节(字节8-16)是计数器。CTR是一种安全的操作模式,但如果我这样修改它呢:
现在是16字节,计数器是16字节。计数器块等于现在的XOR计数器。
基本上,他的计数器块只是现在和计数器的异或。这是安全的,还是这会挫败CTR的想法和不安全?
编辑:为了更清晰起见,这里是CTR模式和我修改的模式:
CTR:
nonce = 12345678
counter = 00000001
CTR block = 1234567800000001我的计划:
nonce = 1234567890abcdef
counter = 0000000000000001
CTR block = 1234567890abcdeW发布于 2021-03-11 17:41:13
CTR的工作方式是:获取一个计数器,将它与一个nonce连接起来,并加密结果。
不完全是。CTR的工作方式是获取一个值,该值在每个块中使用相同的密钥加密并加密。如何构造这个值(计数器块)并不是标准化的,安全的关键是它的唯一性(以及加密密钥的独立性)。
使用CTR模式的一种方法是保持块的计数(一个数字: 0,1,2,…)使用该密钥加密,并使用该数字的表示作为计数器块:通常为256大端或基256小端,如果您将计数器块看作一个8位字节的数组。当有一个实体使用该密钥时,它一次只加密一条消息,它会记住它在块之间停止的位置。
如果多个实体想要加密,或者甚至有一个实体希望并行加密多条消息,这种简单的方法就会崩溃,因为没有实用的方法可以将计数器值保持在单个消息中(否则,您需要将所有计数器值与消息一起保存,而不仅仅是初始值),并避免重复计数器值(这会破坏安全性)。
最好的解决方案是永远不要用相同的密钥加密两条消息,而是执行两个步骤来加密消息:首先从每个消息现在派生密钥,然后使用该单使用密钥对消息进行加密。然后,您将立即发送带有消息的派生,并且不需要发送初始计数器值,因为您可以始终从0开始。
如果您想用相同的密钥加密多条消息,则需要一种方法使每个邮件的计数器值设置断开。这样做的一个常见方法是将计数器块分成两部分:一个每个消息当前,和一个消息内计数器。这将消息的可能长度限制在可以用消息内计数器表示的块数上,例如,32位消息内计数器意味着最大的2^32块(因此2^{36}字节用于加密,例如具有128位块大小的AES )。每个消息的当前值需要是唯一的,例如,发送消息的计数器。
另一种避免保存状态(例如发送消息的数量)的常见方法是使用随机计数器值启动每条消息,并在整个消息中增加它。只要您没有用相同的键发送太多的数据,这是很好的,其中“太多的数据”意味着您不能接近生日装订,即可能的块数的平方根。对于128位块大小,这意味着不要接近2^{64}\,\text{blocks} = 2^{68}\,\text{bytes}的数据.
使用在消息计数器上的每条消息当前是否可以工作,这取决于它是如何生成的。例如,如果现在是发送的消息的计数,它是可怕的坏,因为它会导致重复的计数器块值。在基2中,只代表计数器块的最后三位,您将拥有:
正如您所看到的,计数器块是重复的,这完全破坏了安全性。
如果你的现在是一个随机的128位值,它类似于以一个随机128位值开始并递增它的一般方法,但是有一个计数计数器块的顺序,它依赖于每条消息的初始计数器值。我认为这具有相同的统计属性,但我还没有做过计算。它使实现变得非常复杂。我看不出有什么特别的好处。
https://crypto.stackexchange.com/questions/88783
复制相似问题