如何解密使用一次性密码本加密的消息?我需要得到那个垫子,然后扭转这个过程吗?我在这里很困惑。
如何解码使用一次性密码本加密的消息?
One-Time Pad 是牢不可破的,假设该 pad 是完全随机的、保密的、只使用过一次且不知道明文。这是由于异或(xor)操作的特性。
这是它的真值表:
A xor B = X
A | B | X
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
Number of 0s in column A = 2
Number of 1s in column A = 2
Number of 0s in column B = 2
Number of 1s in column B = 2
Number of 0s in column X = 2
Number of 1s in column X = 2
请注意,它不会引入位偏移——输入中 0 和 1 的数量等于输出中 0 和 1 的数量,即各两个。此外,如果您只知道一行中的一个元素,则无法预测其他两个元素的值,因为它们的概率相同。
例如,假设我们知道 X 为 0。A = 0 且 B = 0 或 A = 1 且 B = 1 的概率相等。现在假设我们知道 X 为 1。A = 0 和 B = 1 的概率相等。 = 0 和 B = 1,或 A = 1 和 B = 0。这是无法预测的。所以,如果你只知道一个元素,你不可能确定任何关于 A 或 B 的信息。
下一个有趣的特性是它是可逆的,即
A xor A = 0
B xor B = 0
A xor 0 = A
B xor 0 = B
A xor B xor B = A xor 0 = A
A xor B xor A = B xor 0 = B
因此,如果我们取任何值并将其与自身进行异或,则结果将被抵消,并且始终为 0。这意味着,如果我们将值 A 与值 B 异或,则稍后将结果与 A 或 B 异或, 我们分别得到 B 或 A。该操作是可逆的。
这很适合密码学,因为:
- xor 不引入位歪斜
- xor 对于任何给定的输出都有同样可能的输入
- 给定 A、B、X 中的任意两个,我们可以计算第三个
因此,以下内容是完全安全的:
ciphertext = message xor key
但前提是消息与密钥长度相同,密钥完全随机,密钥只使用一次,攻击者只知道一个元素。如果他们知道密文,但不知道密钥或消息,那对他们来说毫无用处。他们不可能打破它。为了解密消息,您必须知道整个密钥和密文。
请记住,密钥必须是完全随机的,即每个位必须有相同的概率为 1 或 0,并且完全独立于密钥中的所有其他位。
这实际上被证明是相当不切实际的,原因如下:
- 生成完全随机的密钥很困难。软件生成器(和许多硬件生成器)通常具有微小的偏差和奇怪的重复属性。除了少量之外,几乎不可能获得真正的随机数据。
- 如果攻击者知道密文并且可以正确猜出消息的一部分(例如,他知道它是Windows 可执行文件,因此必须以 开头
MZ),他就可以获得已知范围的相应密钥位。这些位对于解密消息的其他部分是无用的,但如果生成不良,则可以揭示密钥中的模式。 - 您必须能够分发密钥,并且您的密钥必须与您的消息一样长。如果您可以在被授权阅读消息的人之间对您的密钥进行 100% 保密,那么为什么不将您的消息 100% 保密呢?
这里的薄弱环节是你的随机数生成器。一次性垫的安全性完全受发电机安全性的限制。由于一个完美的发电机几乎是不可能的,一个完美的一次性垫也几乎是不可能的。
最后一个问题是密钥只能使用一次。如果您将它用于两条不同的消息,并且攻击者知道两个密文,他可以将它们异或在一起以获得两个明文的异或。这会泄漏各种信息(例如哪些位相等)并完全破解密码。
因此,总而言之,在完美的一次性密文中,您需要知道密文和密钥才能对其进行解密,但完美的一次性密文几乎是不可能的。
一次性垫极难折断,事实上它们在某些情况下仍然使用,如果它们做得正确,那么它们基本上是牢不可破的。在一次性便笺系统中,每个字符都由双方共享的随机数据流更改,如果没有便笺簿的副本,您将无法破解密码。
系统中为数不多的弱点之一是随机数据源。在二战期间,英国一次性垫被打破,他们追踪到一名工人的工作是从鼓中拉出随机编号的球。它应该工作的方式是工人旋转鼓,不看球就随意拉出一个球,再旋转,再捡,等等。工人开始走捷径,拉出多个球后每次旋转并查看数字,选择最喜欢的。它引入了模式,使反对派能够打破垫子,结果失去了生命。
今天的伪随机数源也是如此。如果没有真正的随机数据源,需要数千年才能破解的加密协议实际上只能持续数年或数十年。
假设加密已成功完成,解密的唯一方法是获取垫。
虽然一次性密码被证明是不可能破解的,但请注意,它也非常罕见。
OTP 的部分定义是 pad 必须包含真正随机的数据,而真正的随机数据对于计算机来说很难获得。相反,pad 通常由伪随机数据组成,这通常是当您向计算机询问随机数时得到的。
在这种情况下,您不再拥有牢不可破的加密。相反,您有一条消息与确定性且通常可逆的算法的输出进行了异或运算,可以通过复制相同的伪随机字符串来攻击该算法。如果您知道使用的是什么算法,那么这种攻击尤其具有破坏性,如果您知道种子是如何生成的,则更是如此。在这种情况下,代码可以在几秒钟内被破解。但即使不知道 PRNG 种子,模式通常也可以从消息本身推导出来。
此外,OTP 加密特别笨拙,因为密钥与加密消息一样长,并且必须以某种方式传输给接收者而不会被截获。任何声称使用 OTP 加密且不需要您交换与您的消息一样大(或更大)的密钥块的软件都没有使用真正的随机数据,因此没有使用 OTP 加密。
此外,OTP 的主要功能之一是您不能重复使用旧焊盘。如果你重用一个旧的,甚至一次,这足以让代码被破坏。