XOR encryption/decryption 当密钥超过一个字节长时?

XOR encryption/decryption when the key is more than one byte long?

假设使用字符'b'作为异或加密的密钥。在那种情况下,通过 'b' 的 ascii 代码对文本的每个字节(字符)进行异或运算来加密纯文本。反之,密文再用'b's ascii码异或得到明文。这个就明白了。

但是,当密钥(密码)是一串字符时,究竟如何加密呢?假设加密密码为'adg'。在那种情况下,明文是否通过 XOR-ing 的每个字节与 XOR d XOR g 的值加密?如果没有,那怎么办?

一种方法是重复key覆盖明文

例如密钥 = RTTI,明文 = "how exactly does one"

Text: how exactly does one
Key:  RTTIRTTIRTTIRTTIRTTI

明文中的每个字符都将与其下方对应的关键字符进行异或。

实现方法有很多种"XOR encryption",所以如果您要解码一些现有数据,您首先需要弄清楚它是用哪种加密的。

我见过的最常见的方案,基本和经典方案一样Vigenère cipher;例如对于three-byte密钥abc,明文的第一个字节与a异或,第二个字节与b异或,第三个字节与c异或;第四个字节再次与 a 异或,第五个字节与 b 异或,依此类推,如下所示:

Plaintext: THIS IS SOME SECRET TEXT...
Key:       abcabcabcabcabcabcabcabcabc
--------------------------------------
XOR:       5**2B*2B0./&A1&"0&5B7$:7OLM

识别这种 repeating-key 密码(并找出密钥长度)的一种方法是计算字节对 N[=37= 之间的 index of coincidence ] 在密文中分开的位置。如果密钥长度为 L,则将重合指数绘制为 N 的函数应该会显示 N 处的规则峰值阵列=32=]N 可被 L 整除。 (当然,这只适用于明文类似于普通文本或字节频率分布有偏差的代码;如果它是完全随机的数据,那么这将无济于事。)

或者您可以只使用 hellman 的 xortool,它会为您自动执行所有这些操作。比如运行上面的密文5**2B*2B0./&A1&"0&5B7$:7OLM上面写着:

The most probable key lengths:
   1:   17.3%
   3:   40.7%
   6:   21.5%
   8:   6.5%
  12:   5.4%
  15:   4.6%
  18:   4.0%
Key-length can be 3*n

如果你的密文足够多,并且能猜出明文中最常见的字节,它甚至会为你吐出密钥。