为什么不可能实现 "infinite" 一次一密算法?

Why is it impossible to implement an "infinite" one time pad algorithm?

我对此做了一些研究,但我仍然不确定为什么不能实施。如果我们共享初始 OTP(可能通过 USB 或其他物理安全方法),我们当然可以在随后的消息中包含下一个。

[编辑:更具体地说,如果我要拿一个双倍长度的垫子,将它分成 x 和 y。然后用x加密消息,用两次y加密下一个pad,会不会不安全?]

您必须将每一位消息与相同大小的 OTP 位配对。 OTP 数量有限。

如果您将所有 OTP 位与下一个 OTP 的位配对...

a b c d e ...
q w e r t ...

没有留言空间。而且,如果您继续花费 OTP 转移另一个 OTP,则永远不会有消息空间。

您不能压缩 OTP,因为 OTP 的优势在于它是完全随机的 - 这就是密码破译者不可能做到的原因,因为没有模式可以锁定。

压缩是一种通过查找模式并用更短的 "that large repetitive block goes here and here and there" 信号替换它们来工作的技术 - 根据定义,没有完全随机的模式,因此 OTP 不可压缩。

如果你可以压缩一点,你可以这样做,但不再将它描述为 OTP 是不正确的,它很弱 - 而且还大量浪费带宽。如果你能压缩很多,把你的随机数生成器扔掉它太糟糕了。


在 linux 机器上快速测试概念演示:

$ dd if=/dev/urandom of=/tmp/test count=10k
    -> 5Mb file of randomness

$ bzip2 /tmp/test 
    -> 5.1Mb file
$ gzip /tmp/test
    -> 5.1Mb file

通过添加所有 bzip/gzip 文件格式信息而不做任何其他操作,压缩便笺簿会使其变大。

一次性一密本的强大之处在于,除了缺少模式外,无法判断所使用的密钥是否正确。一条消息可以被解密以揭示某些 "take over the world" 场景,但实际上,每条使用该长度的密钥加密的消息都有一个密钥,可以逐字逐句地揭示完全相同的消息。这意味着您可能拥有实际的解密消息和正确的密钥,但不可能知道是这种情况,而且因为从字面上看,该长度的任何消息(我的意思是字面意思)都可能是结果。即使是橡胶软管解密也行不通。即使 "persuaded" 的人提供了正确的密钥,也无法确定。人们甚至拥有假密钥来解密消息以揭示不是调查人员正在寻找的消息,但肯定是即使是完全无辜的人也会隐藏的消息,这甚至是一种常见的做法。例如,隐藏机密信息的 OTP 可能有一个假密钥,可以显示有人诽谤他们的指挥官。