假设字符“b”用作异或加密的密钥。在这种情况下,加密纯文本是通过将文本的每个字节(字符)与“b”的 ascii 代码进行异或来完成的。反之,将密文与'b的ascii码再次异或即可得到明文。这是可以理解的。
然而,当密钥(密码)是一串字符时,究竟如何加密呢?假设加密密码是“adg”。在这种情况下,明文是否通过将其每个字节与 XOR d XOR g 的值进行异或来加密?如果没有,那又如何呢?
一种方法是重复按键来覆盖纯文本。
例如 key = RTTI,plaintext =“一个到底如何”
Text: how exactly does one
Key: RTTIRTTIRTTIRTTIRTTI
Run Code Online (Sandbox Code Playgroud)
纯文本中的每个字符都将与其下方相应的关键字符进行异或。
实现“异或加密”的方法有很多,因此,如果您尝试解码某些现有数据,您首先需要弄清楚它是用哪种加密的。
\n\n我见过的最常见的方案基本上类似于经典的Vigen\xc3\xa8re 密码;例如,对于三字节密钥abc,明文的第一个字节与 异或a,第二个字节与b,第三个字节与c;然后,第四个字节再次与 进行异或a,第五个字节与 进行异b或,依此类推,如下所示:
Plaintext: THIS IS SOME SECRET TEXT...\nKey: abcabcabcabcabcabcabcabcabc\n--------------------------------------\nXOR: 5**2B*2B0./&A1&"0&5B7$:7OLM\nRun Code Online (Sandbox Code Playgroud)\n\n识别这种重复密钥密码(并找出密钥长度)的一种方法是计算密文中相隔N 个位置的字节对之间的重合索引。如果密钥长度为L,则将重合索引绘制为N的函数,应该会显示可被L整除的N值处的峰值的规则数组。(当然,这仅在明文类似于普通文本或具有偏向字节频率分布的代码时才有效;如果它是完全随机的数据,那么这将无济于事。)
\n\n或者您可以使用 hellman 的xortool,它会为您自动执行所有这些操作。例如,在5**2B*2B0./&A1&"0&5B7$:7OLM上面的密文上运行它,它会说:
\n最可能的密钥长度:\n 1: 17.3%\n 3: 40.7% \n 6: 21.5%\n 8: 6.5%\n 12: 5.4%\n 15: 4.6%\n 18: 4.0%\ n密钥长度可以是 3*n\n\n\n
如果你有足够的密文,并且可以猜测明文中最常见的字节,它甚至会为你吐出密钥。
\n