加密101-异或(xor)

来源:互联网 发布:hyundai键盘鼠标 知乎 编辑:程序博客网 时间:2024/05/22 13:39

描述

异或(xor)是逻辑运算符,符号是⊕。当输入同时为真或同时为假时,输出为假。否则,输出为真。

xor可以叫做“可编程反向器”:一个输入bit位决定要不要对另一个输入bit位取反。



异或(xor)操作的图示如上,在图示左边Pi是明文文本(plaintext)的bit位,i是bit位的索引,因为我们要处理不止一个bit位。在图示上方是Ki,代表密钥(key)的bit位,用来决定是否反转Pi。在右侧生成密文(ciphertext)Ci,也就是异或操作生成的结果。

异或的一些性质

当有一个输入为1而另一个输入不为1,输出为1。

可以从上图推出一些运算性质:

  1. Xor运算符合交换率,a ⊕ b = b ⊕ a;
  2. 如果输入相同,输出0。a ⊕ a = 0;   0 ⊕ 0 = 0,1 ⊕ 1 = 0;
  3. 和0做异或运算,输出为它本身。 a ⊕ 0 = a; 0 ⊕ 0 = 0, 1 ⊕ 0 = 1;

计算 a ⊕ b ⊕ a =  b?

a ⊕ b ⊕ a a⊕ab(性质1)
                = 0b(性质2)
                = b(性质3)  
以上性质通常用来xor加密,第一步是加密过程,对b进行加密。第二步是解密过程。

假设你要加密的内容为a,密钥为b,则可以用异或加密:

c=a ⊕ b

在数据中保存c就行了。

用的时候:

a=b ⊕ c

即可取得原加密的内容,所以只要知道密钥,就可以完成加密和解密。

异或运算

我们已经定义了一个bit的异或运算,通常我们需要处理多个bit。大部分编程语言都提供了异或运行符(^)。

一次性密码本

在19世纪发明的一次性密码本(one-time pad)可以用异或实现。一次性密码本的密钥由随机选择的二进制串组成,该密钥串与明文消息有相等的长度。该密钥与明文消息做异或运算以生成密文消息。
正确使用一次性密码本进行加密,在理论上是无法破解的。需要注意的是,许多对称式加密算法本质上是通过一定的算法来将密钥作为伪随机数发生器的种子来产生(近似于)一次性密码本的序列,因此类似的问题也需要予以重视:不要重复使用同一个一次性密码本(或密钥)来加密不同的明文数据。
假设我们有明文文本的二进制序列,并且随机密码本的二进制序列在发送者和接受者中共享。我们可以通过异或取得密文(Ci)。
如果攻击者看到密文,他们在没有密码本(Ki)是不可能解密出明文的。(Eve:监听者)

关于破解

一次性密码本安全的两个必要条件:
  1. 使用真随机数作为密钥;
  2. 不要反复使用同一个密码本,或者同一个对称密钥;

重用

假设攻击者截获了两个用同样密码本加密的密文,攻击者可以对两个密文进行异或运算,相当于对两个明文进行了异或运算。

最终结果并不能单独得到P1和P2,而是P1^P2。为了单独得到P1或P2,你需要抵消异或运算,也就是必须知道其中一个明文,这是不可能的。但是我们可以知道两个明文共同的一些信息。如下图所示:


a,b代表明文信息,c,d是a,b分别用同一个密钥e生成的密文,f是两个密文进行异或运算的结果。

Crib-dragging方法

假设我们有一些用同一个密钥K生成的密文Ci。如果我们能正确的猜出其中一个Cj密文对应的明文Pj,就可以求出共享密钥K。

因为共享密钥K已知,我们现在可以解密其他所有密文:

不幸的是我们并不能猜出整个密文,但是可以猜出其中一小部分密文(hard work)。
假设我们猜出了部分明文bit位Pi
k=Ci ⊕ Pi
所有密文处在同一个偏移位置的密钥都是k,求出同一偏移位置的所有明文:
Pi = Ci⊕ k。
猜中一部分明文文本要比猜中所有明文文本要简单的多,假设我们的明文文本是英文,下面是找一组常见的英文单词。通常来说,the, to, then 这样的单词出现的频率非常高,因此,以它们作为突破口。如果我们更了解加密的文本就可以进行更靠谱的猜测,例如,HTML,要猜Content-Type等等。
那怎么知道我们猜的是正确的呢?如果我们的猜测是正确的,那么看密文在同一偏移位置解密出来的明文是否有意义。
对于每一条明文的同一个位置的内容,假定明文内容是空格,可以得到密钥可能是(密文)XOR(0x20),然后用这个可能的密钥去解其它的密文。假如解出来的明文都是字母,数字,标点或空格的话,则说明这个密钥很可能就是真正的密钥。用程序可以迅速对此作出判断。
假设成功猜出了5个字母 ␣the␣ ,在另一个文本中解出了对应 t␣thr ,可以查字典查找以thr开始的单词,例如through。重复过程。

遗留问题

一次性密码本在正确使用时很安全,但在现实中确很少使用,因为它是不切实际的:
密钥key和需要加密传输的数据一样长,而且还要保证密钥key交换的方便和安全。

即使有这些缺陷,它还是有用武之地的。


@斗大的熊猫
0 0
原创粉丝点击