c - 一次一密中两个密文的异或信息给我什么?

标签 c cryptography cryptanalysis

因此,我们被告知不要对一次性一密使用相同的 key ,因为如果攻击者知道这两个密文,他就可以获得这两个明文的异或。例如:

Plain Text1: 0001011
Key        : 1010110
Ciphertext : 1011101

Plain Text2: 0110011
Key        : 1010110
Ciphertext : 1100101

XOR of ciphertexts
1011101
1100101
0111000

XOR of plaintexts (which of course match)
0001011
0110011
0111000

但是这些信息究竟给攻击者带来了什么优势呢?两个明文异或,他能做什么?

最佳答案

我想会有很多其他答案,但您可以执行以下操作 - 尝试猜测一个已知单词在任一文本中的给定位置,然后将该位置与该单词进行异或运算。如果该值看起来合理(统计上看起来像您感兴趣的明文),那么您就知道两个明文的一部分。

假设您有以下明文异或(或密文,对于 ciphertext == plaintext xor OTP 问题中描述的情况相同):

"\x10\x00\x1f\x17E\x0c\x00H\r\x1dR\x06\x0bK\x0c\x0e\x03\x1aE\x01\rR\x1a\x1a\x06P\x04\x00RE"

现在您尝试从字典中匹配单词,发现如果您将此字符串与位置 1 的“correct”异或,您将得到:

some ot

好的,所以你的明文很可能是:

correct.....
some ot.....

现在尝试将以“ot...”开头的单词与 xor 进行异或,并找出“other”得到的结果(连同已知的开头):

correct ho

所以你的明文是:

correct ho....
some other....

等继续这样下去,你就可以恢复两个完整的字符串。对于不是英语单词的明文,这当然会更难,但仍然有可能。而且您在任何时候都不需要知道 OTP 内容。

关于c - 一次一密中两个密文的异或信息给我什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19099250/

相关文章:

c - 循环依赖于十六进制值的算法

c - 我如何知道在调用 waitpid() 后我的子进程实际上已被收获?

c - C语言默认switch case

java - BadPaddingException 使用 AES 算法解密 java

CryptGenRandom 返回不统一的结果

security - 为什么建议公开加密算法?

c - fread() 从二进制文件读取时出现意外行为

c - %p c 中的格式说明符

cryptography - 为什么 s-box 输入比其输出长?