为什么在密码学上使用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属性(a或b)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模