(同步)流密码是一种将一些固定长度的密钥映射到任意长度的密钥流(即一系列位)的算法:$ C:\ {0,1 \} ^ k \到\ {0, 1 \} ^ {\ infty} $。

然后将该密钥流与纯文本流进行异或,得到密文流。
对于解密,相同的密钥流(由接收方的密钥生成)将与密文流进行异或运算,从而再次提供密钥流。

一次性填充算法是一种采用大尺寸密钥的算法(至少是邮件大小),然后将其与明文开始XOR以获得密文。对于解密,我们将密钥的开头与密文异或以获取明文。

这些看起来很相似–可以说流密码是一种(创建/使用密码的特殊方法。 )一次性填充,还是一次性填充是一种流密码?

这两类算法之间有重要区别吗?

#1 楼

“流密码”一词没有普遍接受的定义。但是我最常遇到的问题如下:流密码是一种对称加密算法,它接受任意位(或字节)序列作为输入,例如:


输出等于输入的长度(无填充);对于任何$ n $(可能是任何$ n $(如果我们将自己限制为字节,则为8的倍数)),第一个$ n $输出位仅依赖于密钥和前$ n $个输入位,而不考虑后续输入位的值。

从这个意义上讲,一次性填充是一种流密码。在CTR模式或CFB模式下使用的分组密码也是流密码。注意,后者不是“与从密钥独立于输入数据生成的流进行异或”的类型。您链接到的Wikipedia页面谈论“同步流密码”和“自同步流密码”。

但是,一次性密码夹的最终安全性取决于密钥大小:它是坚不可摧的因为它假定密钥与消息一样长,并且是由不可预测的机制生成的。如果您使用更常规的流密码在较小的固定大小的密钥上生成填充,则它不再是一次性填充,而只是“常规”流密码。 “一次性密码”一词专门指的是使用真正随机长键的神话式方案。因此,虽然“一次性密码”是流密码,但“密码”不是“一次性密码”。

评论


$ \ begingroup $
还请注意,计算上不受限制的对手可能会破坏流密码(具有足够的已知明文),但不会破坏一次性密码。
$ \ endgroup $
– Henno Brandsma
2011-09-27 19:32

$ \ begingroup $
由于一次性垫板已被实际使用,所以这不是神话。例如,始于1967年的最初的莫斯科-华盛顿热线使用了一次性垫。
$ \ endgroup $
– David Cary
2011年10月17日在12:11

$ \ begingroup $
@David:我没有有关填充垫如何生成的详细信息。 “红色电话”具有一次性垫的操作限制(即要求每周在磁带上分配大键),但除非垫是使用100%物理RNG生成的,否则它不是“真正的”一次性垫。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011-10-17 12:50

$ \ begingroup $
一次性便笺簿和Venona项目的文章说,苏联和其他一些组织大量使用看起来像随机字母的物理便笺簿,即一次性便笺簿。我认为几乎所有这些填充垫实际上都是由100%物理RNG生成的,尽管我真的没有任何一种或另一种证据。我怀疑我们可能永远不知道这些填充物是如何产生的。
$ \ endgroup $
– David Cary
2012年7月30日17:25

$ \ begingroup $
另外,不要忘记Numbers Station也会发送OTP加密的消息。 Venona试图对Cuban Numbers Station进行解码,结果证明是在重复使用键盘。这是他们被破解的唯一原因。那和一些代理也没有正确处置用过的垫。
$ \ endgroup $
– WAR10CK
16-2-24在15:26

#2 楼

一次性密码和流密码之间的一个重要区别是一次性密码的安全性证明。香农证明一次性垫提供了完美的保密性。他还提供了另一种有趣的证据,对这一讨论很有趣。他的证明是,除非密钥至少与消息一样长,否则任何密码都无法提供完美的保密性。因此,我们知道,除非流密码满足该要求,否则它不能提供完美的保密性。但是,仅仅因为它满足了这一要求并不意味着它会自动提供完美的保密性。

现在,关于它们是否相同,答案是否定的。一次性键盘使用固定长度的密钥(其中长度至少是消息的其他要求之一)和异或运算的周期(即没有密钥扩展/流生成)。

#3 楼

从数学上讲。流密码的熵以密钥大小为上限。

另一方面,一个时间片的熵以明文大小为上限。

对于真正的一次性填充和良好的流密码,此界限很严格。

评论


$ \ begingroup $
如何为密码(即算法)定义“熵”一词? (除了术语动力学意义之外,我只知道它是对数据随机性的一种度量。)
$ \ endgroup $
–PaŭloEbermann
13年7月6日在21:06

#4 楼

引用密码学和网络安全性(William Stallings,第7.4节)和其他来源(例如,https://www.fourmilab.ch/hotbits/)

流密码类似于一次性密码但是确切的区别在于,
一次性密码使用真正的随机数流,而流密码使用伪随机数流
由计算机通过确定性过程计算出的伪随机数,根据定义随机。掌握了用于创建数字及其内部状态的算法的知识之后,您就可以预测随后调用该算法返回的所有数字,而对于真正的随机数,则不需要一个数字或任意长的数字序列预测要生成的下一个数字的任何方法。


评论


$ \ begingroup $
这似乎是从密码学和网络安全(W​​illiam Stallings,第7.4节)和其他来源(例如,fourmilab.ch / hotbits)中逐字逐句地复制的,没有注明出处。窃并不酷。
$ \ endgroup $
– D.W.
17年5月21日在16:37

$ \ begingroup $
@ D.W。我已经发送了与system窃问题相关的相应系统电子邮件,并通过编辑添加了报价来源。
$ \ endgroup $
– e-sushi
17年5月21日在16:58



#5 楼

更重要的是,无论您使用多少个不同的密钥流,流密码只能产生一个纯文本。因此,即使您使用真正的RNG实现了流密码机,并且不间断地输入了比特流,仍然可以进行蛮力攻击,因为您一直尝试直到获得有意义的东西。 >
一次性键盘可以产生与密文大小相同的任何明文,具体取决于您使用的是不同的密钥流。意味着您可以继续尝试,但是会得到很多有意义的东西。

因此,除非您具有用于解码消息的确切填充,否则您将永远不会知道偶然发现的可能的纯文本中的哪一个是正确的,甚至即使您已找到正确的明文。 br />
那是完美的秘密。当您甚至无法告诉您是否已经破解了该消息时。

评论


$ \ begingroup $
“流密码只能产生单个明文”,“仍然可以进行强力攻击,因为您只要不断尝试,直到获得有意义的东西为止。”只是没有。大多数流密码都是通过具有CTR模式或哈希函数的对称密码实现的。而且,您肯定会从蛮力攻击中获得可读的消息,但是您将无法知道哪个消息是正确的消息。
$ \ endgroup $
– Biv
16-2-24在15:28



$ \ begingroup $
因此,您说的是,如果我确实使用RC4或AES-CTR创建一台计算机,并让TRNG连续不断为其提供恒定的稳定随机比特流,那么它将满足OTP的完美保密要求吗?假设在每条消息之后清除了比特流?
$ \ endgroup $
– WAR10CK
16-2-24在17:54

$ \ begingroup $
参见:crypto.stackexchange.com/questions/33100我可能会被否决,但这是更好的选择,以获得可能甚至比我更好的答案。 :)
$ \ endgroup $
– Biv
16-2-24在18:47



#6 楼

托马斯·珀金(Thomas Pornin)的最后一段是正确的,但是这个概念仍然经常被人误解,以至于我想加2美分。

从外行的角度来看,如果您确实有一种实现了一次性的功能,垫,它会是什么样?它必须涉及生成真正随机密钥流的物理机器。该机器不会输入任何密码,密钥或种子作为输入-而是会使用物理学的属性生成真正的随机位,前提是假设在存在真正随机性的情况下物理学是正确的。请注意,由于这些位是真正随机生成的,因此无法再次导出,这意味着机器还必须输出这些密钥流位,以便您可以将它们物理地传递给预期的接收者,从而允许他解密密文。顺便说一句,当我说“实际交付”时,这意味着要上飞机或乘汽车,前往目的地,然后将零碎的物品交给接收者。为什么不使用公钥交换呢?可以,但是这样做会以失去完美的保密性为代价,因此这样做会首先破坏使用一次性键盘的全部目的。

此时,您可能以为这太疯狂了,如果可以的话,那么恭喜您:现在您了解了为什么它只是一个理论构造,而不太可能在实践中实现。取而代之的是,我们今天使用的是依赖于实用性理论的密码学。

从外行的角度来看,流密码是对一种实际构造的尝试,这种构造“感觉像”一次性垫,但缺乏完美的保密性。它不需要物理机器即可实现。它不是输入真正的随机性,而是输入密码,密钥或种子,然后将其扩展为一长串位,这些位是从该输入派生的。可以使用相同的密码/密钥/种子来一次又一次地获得这些相同的位,因此为了使接收者解密,它们只需要获取该输入即可。而且由于它不具有完美的保密性,而仅取决于复杂性理论,因此当您使用公共密钥密码交换该密钥时,您什么也不会损失。

要点:几乎所有您将要做的事情在实践中见过一次一次性的“感觉”并不是真正的一次性。它是流密码。人们不应该将任意流密码标记为一次性密码,因为他们完全没有意义。一次性密码是理论概念,流密码是实际的模仿,但是缺乏使一次性密码成为其本质的安全性。

评论


$ \ begingroup $
实际上,如果您可以提前交付密钥,那么一次性垫在实践中就非常有用。在现代密码学发展之前,它就被用于历史,例如在冷战期间确保莫斯科和华盛顿之间的安全通信。
$ \ endgroup $
–PaŭloEbermann
16年6月6日在13:02

$ \ begingroup $
@PaŭloEbermann,同意您的主张,但也值得一提的是犯了错误:密钥被重新使用,从而不再安全。发生这种情况时,破解密文并不困难。
$ \ endgroup $
–TheGreatContini
16年6月6日在19:44

#7 楼

最重要的区别在于它们的安全级别。 OTP具有完美的保密性,但是流密码具有计算的保密性。另一个区别是它们在现实世界中的使用。由于流密码本身的结构和密钥长度,可以在我们的现实世界中使用流密码,但是关于OTP密码,产生一个一次性密码并仅使用此密码一次,是如此困难(在许多情况下是不可能的),并且具有密码的大小大于或等于明文的长度,导致使用此密码在现实世界中不切实际。我们可以说,流密码是OTP的弱模型,它使OTP在现实世界中变得实用。

评论


$ \ begingroup $
现实世界中的消息长度没有限制。任何长度都可以。
$ \ endgroup $
– Arsalan Vahi
18年8月18日在7:35

$ \ begingroup $
因此,如果我的纯文本是Tweet大小的,那么您认为OTP在现实世界中可能是可行的吗?考虑到一个2GB£3的闪存驱动器可以容纳1000万条推文的足够密钥材料?
$ \ endgroup $
–Paul Uszak
18年8月18日在9:49

$ \ begingroup $
如果您和您的合作伙伴认为OTP很实用,并且在开始任何通信之前已经共享了Pad的相同副本,并且决不要第二次使用该Pad加密消息。在海军的示例中,在海军去太平洋之前,您给了他2 Gb的便笺簿,然后他每次要发送秘密消息时,都要使用该便笺簿的一部分,并且当便笺簿完成时,他无法发送任何信息。秘密讯息。并考虑如何保持这个长垫的安全和秘密???
$ \ endgroup $
– Arsalan Vahi
18年8月18日在14:44