为什么在密码学上使用XOR?

为什么XOR只用在密码algorithm中,其他的逻辑门如OR,AND和NOR不用?

说逻辑运算XOR是所有密码学中唯一使用的逻辑运算并不是完全正确的,然而它是仅有的专用encryption方式。

这是解释:

想象一下,你有一串二进制数字10101 ,你XOR串10111与它你得到00010

现在你的原始string被编码,第二个string成为你的密钥,如果你的密钥与你的编码string异或你得到你原来的string。

XOR允许您轻松encryption和解密一个string,其他逻辑操作则不会。

如果你有一个更长的string,你可以重复你的密钥,直到足够长的时间,例如,如果你的string是1010010011那么你会简单地写你的密钥两次,它会变成1011110111 ,并与新string异或

这是XOR密码的维基百科链接。


主要原因是如果一个未知分布的随机variablesR1与一个随机variablesR2进行XOR并且分布均匀,那么结果就是一个分布均匀的随机variables,所以基本上可以很容易地随机化一个有偏差的input,这是其他二元运算符所不可能的。

异或的输出总是取决于两个input。 你提到的其他操作不是这种情况。

我可以看到2个主要原因:

1)XOR不会泄漏关于原始明文的信息。

2)如果你应用XOR两次,你会得到原始的明文(即XOR(k, XOR(k, x)) = x ,其中x是你的明文, k是你的密钥)。 内部异或是encryption,外部异或是解密,即完全相同的异或function可用于encryption和解密。

为了举例说明第一点,考虑AND,OR和XOR的真值表:

0和0 = 0

0和1 = 0

1和0 = 0

1 AND 1 = 1(泄漏!)

要么

0 OR 0 = 0(泄漏!)

0或1 = 1

1或0 = 1

1或1 = 1

XOR

0 XOR 0 = 0

0 XOR 1 = 1

1 XOR 0 = 1

1 XOR 1 = 0

第一列的所有内容都是我们的input(即纯文本)第二列是我们的密钥最后一列是使用特定操作(即密文)与密钥“混合”(encryption)的结果

现在,想象一下攻击者可以访问一些encryption字节,比如: 10010111 ,他想得到原始的明文字节。

假设使用AND运算符来从原始明文字节中产生这个encryption字节。 如果使用了AND,那么我们可以肯定地知道,每当我们在encryption字节中看到比特“1”时,input(即,第一列,纯文本)也必须是“1”和。 如果encryption位是“0”,我们不知道input(即纯文本)是“0”还是“1”。 因此,我们可以得出结论:原始的明文是:1 _ _ 1 _ 111​​,所以原始明文的5位被泄露(即可以不用密钥访问)。

将相同的想法应用于OR,我们看到每当我们在encryption字节中发现“0”时,我们知道input(即纯文本)也必须是“0”。 如果我们find“1”,那么我们不知道input是“0”还是“1”。 因此,我们可以得出结论,input纯文本是:_ 00 _ 0 _ _ _。 这一次,我们能够泄漏原始纯文本字节的3位而不知道关键字。

最后,用XOR,我们不能得到任何原始明文字节的位。 每当我们在encryption字节中看到一个'1'时,'1'可以从'0'或从'1'产生。 与'0'(可能来自“0”或“1”)相同的东西。 因此,原始明文字节中没有一位泄漏。

我认为是因为异或是可逆的。 如果你想创build哈希,那么你会想避免XOR。

XOR是唯一直接使用的门,因为不pipeinput是什么,其他input总是对输出有影响。

但是,它不是encryptionalgorithm中唯一使用的门。 旧式密码学可能是这样的,这种密码学涉及大量的位洗牌和XOR以及旋转缓冲区,但对于基于素数的密码,您需要各种不通过XOR实现的math。

XOR就像一个切换开关,您可以在其中打开和closures特定的位。 如果你想“争夺”一个数字(一个比特模式),你用一个数字来异或。 如果你拿起那个混乱的号码,并用相同的号码再次异或,你会得到你的原始号码

 210 XOR 145 gives you 67 <-- Your "scrambled" result 67 XOR 145 gives you 210 <-- ...and back to your original number 

当你用XOR“打乱”一个数字(或文本或任何位的模式)时,你有很多密码学的基础。

XOR使用更less的晶体pipe( 4个与非门 )比更复杂的操作(例如ADD,MUL),这使得在门数很重要时在硬件中实现是很好的。 此外,异或是自己的反转,这使得它适用于密钥材料(相同的代码可以用于encryption和解密)AES的简单的AddRoundKey操作就是一个例子。

对于对称密码,唯一真正select与密码混合而不增加长度的操作是操作加进位,加无进位(XOR)和比较(XNOR)。 任何其他操作都会丢失位,扩展或在CPU上不可用。

XOR属性(ab)xor b = a适用于stream密码:为了对位宽数据进行encryption,使用密钥和密码algorithm生成n位的伪随机序列。

发件人:
数据:0100 1010(0x4A)
伪随机序列:1011 1001(0xB9)
                         ------------------
encryption数据1111 0011(0xF3)
                         ------------------

接收器:
encryption数据1111 0011(0xF3)
伪随机序列:1011 1001(0xB9)(接收方有密钥并计算相同的序列)
                         ------------------
                          0100 1010(0x4A)解密后的数据
                         ------------------

让我们考虑三个常见的按位逻辑运算符

比方说,我们可以select一些数字(我们称之为掩码),并将其与一个未知的值结合起来

  • AND是强制一些位为零(在掩码中设置为零)
  • 或者是强制将某些位设置为1(在掩码中设置为1)

XOR更微妙,无论您select哪个面具,都无法确定结果的任何位的值。 但是如果你两次使用面具你会得到初始值。

换句话说,AND和OR的目的是去除一些信息,这绝对不是你想要的密码algorithm(对称或非对称密码,或数字签名)。 如果你失去了信息,你将无法得到它(解密)或签名将容忍消息的一些微小的变化,从而击败它的目的。

所有这一切,密码algorithm,而不是他们的实现是真的。 密码algorithm的大多数实现也使用许多AND,通常从32或64个内部寄存器中提取单个字节。

你通常会得到这样的代码(这是aes_core.c的几乎随机提取)

 rk[ 6] = rk[ 0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te0[(temp ) & 0xff] & 0x0000ff00) ^ (Te1[(temp >> 24) ] & 0x000000ff) ^ rcon[i]; rk[ 7] = rk[ 1] ^ rk[ 6]; rk[ 8] = rk[ 2] ^ rk[ 7]; rk[ 9] = rk[ 3] ^ rk[ 8]; 

8个XOR和7个AND如果我指数正确

我认为它只是因为给定一些随机的二进制数集合,大量的“或”操作将倾向于所有的“1”,同样大量的“与”操作也趋于全零。 大量的“异或”产生一个和零的随机select。

这并不是说AND和OR不是有用的 – 只是XOR更有用。

密码术中OR / AND和XOR的stream行有两个原因:

其中一个是闪电指示。

两个他们很难使用传统的math公式进行build模