猜测 XOR 秘密密钥知道它的一部分

Guessing XOR secret key knowing some part of it

我正在尝试猜测使用 Python 解密消息的密钥 3. 我知道消息将类似于: crypto{1XXXXXX} 其中 XXXXXXX 是消息的未知部分消息。 加密消息是:'0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104' 我有以下代码:

from pwn import xor

flkey=bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')

print(flkey)

y = xor(flkey, "crypto{1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}")

print(y)

xor(flkey, y)

我的问题是,如何只知道邮件的一部分才能找到邮件的其余部分?我对这个与 XOR 相关的主题很陌生。

编辑:当我打印(y)时,我得到:

b'crypto{1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}'

所以我猜括号之间的长度是34。

密码学中异或运算的弱点在于A XOR B XOR A = B。因此,当您知道相应加密消息 C 的明文消息部分 M 时,您会立即获得该部分密钥作为 K = M XOR C.

特别是:

 >>> cypher = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
 >>> plaintext = b'crypto{1'
 >>> key = ''.join(chr(c ^ m) for c, m in zip(cypher, plaintext))
 >>> key
 'myXORkey'

这就是整个密钥的可能性很高(实际上是,留作练习)。此字符串将根据需要重复多次以匹配纯文本长度。

现在假设这不是全部密钥。但是,我们知道密钥会在循环中重复,因此我们已经知道的那部分 myXORkey 将在以后的某个地方重复使用。我们可以开始将它应用到 cypher 中的各个地方,看看它什么时候开始有意义。这样我们就知道了消息的密钥长度和部分。从这里开始有几种方法,最简单的是,因为我们知道明文的某些部分,我们可以通过感觉找到丢失的部分,然后从那里找到密钥的剩余部分。

以下属性可能有所帮助:

  • 密钥足够短
  • 关键是有道理
  • 你知道纯文本是用什么语言写的

如果密钥与消息一样长,是真正随机的,并且只使用一次,则密码无法破解(参见 One-time pad)。

在明文 or/and 密钥长度未知的一般情况下,有基于 Hamming distance and transposition (The method was first discovered in 19th century by Friedrich Kasiski to analyze the Vigenère cipher.

的更复杂的方法