首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CTR块生成

CTR块生成
EN

Cryptography用户
提问于 2021-03-11 16:52:03
回答 1查看 316关注 0票数 1

据我所知,CTR的工作方式是:获取一个计数器,将它与一个nonce连接起来,并对结果进行加密,从而使XORed进入密文。用于128位分组密码(即。),我的理解是CTR块的前8个字节是现在,下半个字节(字节8-16)是计数器。CTR是一种安全的操作模式,但如果我这样修改它呢:

现在是16字节,计数器是16字节。计数器块等于现在的XOR计数器。

基本上,他的计数器块只是现在和计数器的异或。这是安全的,还是这会挫败CTR的想法和不安全?

编辑:为了更清晰起见,这里是CTR模式和我修改的模式:

CTR:

代码语言:javascript
复制
nonce = 12345678
counter = 00000001
CTR block = 1234567800000001

我的计划:

代码语言:javascript
复制
nonce = 1234567890abcdef
counter = 0000000000000001
CTR block = 1234567890abcdeW
EN

回答 1

Cryptography用户

回答已采纳

发布于 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中,只代表计数器块的最后三位,您将拥有:

  • 第一条消息:第一个计数器块000 \oplus 000 = 000,第二个计数器块000 \oplus 001 = 001,…
  • 第二条消息:第一个计数器块001 \oplus 000 = 001,第二个计数器块001 \oplus 001 = 000,…

正如您所看到的,计数器块是重复的,这完全破坏了安全性。

如果你的现在是一个随机的128位值,它类似于以一个随机128位值开始并递增它的一般方法,但是有一个计数计数器块的顺序,它依赖于每条消息的初始计数器值。我认为这具有相同的统计属性,但我还没有做过计算。它使实现变得非常复杂。我看不出有什么特别的好处。

票数 5
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/88783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档