使用场景:
Crib-drag 攻击主要用于一次性密码本(OTP)或流加密 在密钥重用时,即两个不同的明文使用了相同的密钥进行加密。
Crib-Drag 攻击原理:

攻击过程:
-
获取多个密文:
-
攻击者截获两个密文 C1 和 C2。
-
发现它们使用了相同的密钥 K。
-
-
计算密文异或:
-
计算 C1 ⊕ C2 = P1 ⊕ P2
-
这个结果暴露了两个明文的异或关系。
-
-
猜测已知明文(Crib):
-
攻击者尝试一个可能的明文片段 Crib(例如 “THE ”, “SECRET”)。
-
通过 XOR 操作,将 Crib 拖拽(Drag)到不同的位置,并检查是否产生有意义的明文片段。
-
-
逐步推导完整明文:
-
一旦猜测的 Crib 位置正确,就可以推出部分明文。
-
利用这一部分已知信息,可以逐步破解更多内容。
-
破解方法:
方法1:已知明文攻击(KPA)
假设敌方使用相同的密钥流 K 加密两条不同的消息:
-
第一条密文(拦截自已知明文) C1 = P1 ⊕ K
-
第二条密文(拦截自未知明文) C2 = P2 ⊕ K
攻击者已经知道 明文P1,则可以计算:
K = C1 ⊕ P1
然后攻击者可以直接解密第二条密文:
P2 = C2 ⊕ K
方法2:统计分析
核心思路:利用语言的常见模式、字母频率分布、语法规律等信息来推测明文内容
假设:
C1 = 01000010 01101111 01101100 01100100 01100101 01110010
C2 = 01010100 01101000 01100101 01100100 01100101 01110100
C1 ⊕ C2 = 01000010 01101111 01101100 01100100 01100101 01110010
⊕ 01010100 01101000 01100101 01100100 01100101 01110100
-----------------------------------------------------------------------------------------------------------
00010110 00000111 00001001 00000000 00000000 00000110
所以,P1 ⊕ P2 = 00010110 00000111 00001001 00000000 00000000 00000110
有两个字节 00000000
,这意味着 P1 和 P2 在这些位置上的字符是完全相同的。
在 P1 ⊕ P2 中,字节 00000000
可以对应空格字符 ' '
(ASCII:00100000
)。所以我们可以大胆猜测 P1[3] 和 P2[3] 是空格。
接着,通过逐字推测,我们可以利用 P1 ⊕ P2 中每一个字节的值,并结合频率分析和语言常识,进一步推断 P1 和 P2 的值。(需要依情况具体分析)
方法3:交互式解密
核心思想:攻击者能够与系统进行交互,并利用系统返回的反馈信息,逐步恢复密文中的明文
(假设截取完整密文的开头作为单独的短密文):
C1 = 2F 88 5C C7 3E
C2 = 6A 99 50 C7 2E
C1 ⊕ C2 = 45 11 0C 00 10
即:P1 ⊕ P2 = 45 11 0C 00 10
用一些常用的单词猜测开头("The”、“Dear”、“Hello"或其他有意义的词进行猜测)
假设猜测:
P1 = "HELLO" (ASCII: 48 45 4C 4C 4F)
P2 = P1 ⊕ (C1 ⊕ C2) = "\rT L_" (不是可读文本)
如果得到可读文本,则破译成功,否则调整单词,直到破解出 P2。