Many-Time-pad 攻击
介绍
首先我们要知道这个攻击所用到的算法,其实很简单,就是异或(XOR)算法。
生成一个用来加密的字符串key,利用key去异或相同长度的明文字符串,得到密文。
解密过程也是,将密文与key异或,得到明文。
攻击原理
接下来介绍一下攻击的原理。在 Many-Time-Pad 攻击中,密钥本被错误地多次使用。这使得不同的密文可以通过数学运算进行比较和分析,从而暴露出一些有关密钥的信息,甚至可能恢复出部分明文。简单来说,当加密同一密钥多次时,攻击者可能通过对比多个密文之间的关系来破解密钥或推测消息内容。
举个例子:
假设一个攻击者能够截获以下两个密文,它们是通过相同的密钥加密的:
C1 = M1 ⊕ K
C2 = M2 ⊕ K
攻击者对这两个密文进行异或操作得到:
C1 ⊕ C2 = (M1 ⊕ M2)
那么攻击者就可以在不知道Key的情况下,分析出部分的明文。
例子
举一个具体的例子来说:
M1:"HELLO"
M2:"WORLD"
两个明文的长度相同
接下来随机设置一个长度是五的key
K = [0xA3, 0xD4, 0xF1, 0xC3, 0x89] # 随机生成的密钥
将明文 M1 = "HELLO" 和密钥 K 进行异或得到密文 C1:
明文 (M1) | H | E | L | L | O |
---|---|---|---|---|---|
ASCII | 72 | 69 | 76 | 76 | 79 |
密钥 (K) | 163 | 212 | 241 | 195 | 137 |
密文 (C1) | 235 | 149 | 27 | 47 | 216 |
得到的密文C1
C1 = [0xEB, 0x95, 0x1B, 0x2F, 0xD8]
同样得到密文C2
C2 = [0xEC, 0x03, 0x37, 0x17, 0xCD]
接下来通过对C1和C2进行异或,我们看看会得到什么
C1 ⊕ C2 = [0x01, 0x96, 0x2C, 0x1E, 0x15]
这个结果是两个明文 M1
和 M2
对应字符之间的异或值
因为明文中的字符通常是可打印字符(ASCII 码在 32 到 126 之间)所以假设我们能猜测到明文中的一些常见字符,例如:
M1[0]
可能是字母 "H",它的 ASCII 值是 72(0x48
)M2[0]
可能是字母 "W",它的 ASCII 值是 87(0x57
)
那么 0x48 ⊕ 0x57 = 0x01
证明出我们的假设成立。具体做法我们就可以通过爆破两个可打印字符,让他们两个进行异或,看看最后结果是否能得到明文的异或值来进行爆破猜解