为什么在加密算法中只使用XOR,而不使用OR,AND和NOR等其他逻辑门?
答案 0 :(得分:65)
说完逻辑运算XOR是所有密码术中唯一使用的逻辑运算并不完全正确,但它是唯一一种专门使用它的双向加密。
以下是解释:
想象一下你有一串二进制数字10101
并且你用10111
00010
进行异或
现在你的原始字符串被编码,第二个字符串成为你的密钥 如果您使用编码的字符串对您的密钥进行异或,则会返回原始字符串。
XOR允许您轻松加密和解密字符串,其他逻辑操作则不然。
如果你有一个更长的字符串,你可以重复你的密钥,直到它足够长
例如,如果你的字符串是1010010011
,那么你只需简单地写两次你的密钥就会变成1011110111
并用新字符串对它进行异或
这是wikipedia link on the XOR cipher.
答案 1 :(得分:33)
我可以看到两个原因:
1)(主要原因)XOR不会泄漏有关原始明文的信息。
2)(很好的理由)XOR是involutory function,即,如果你应用XOR两次,你会得到原始明文(即XOR(k, XOR(k, x)) = x
,其中x
是你的明文,k
是你的关键)。内部XOR是加密,外部XOR是解密,即,完全相同的XOR函数可以用于加密和解密。
举例说明第一点,考虑AND,OR和XOR的真值表:
0和0 = 0
0和1 = 0
1 AND 0 = 0
1 AND 1 = 1(泄漏!)
0 OR 0 = 0(泄漏!)
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
第一列上的所有内容都是我们的输入(即纯文本)。 第二列是我们的密钥,最后一列是您使用特定操作(即密文)与密钥“混合”(加密)输入的结果。
现在,想象一下攻击者可以访问某些加密字节,比如说: 10010111 ,他希望获得原始明文字节。
假设使用AND运算符是为了从原始明文字节生成此加密字节。如果使用AND,那么我们肯定知道每次我们在加密字节中看到位'1',那么输入(即第一列,纯文本)也必须是'1',按照真值表和。如果加密位是'0',我们不知道输入(即纯文本)是'0'还是'1'。因此,我们可以得出结论,原始纯文本是:1 _ _ 1 _ 111.因此原始纯文本的5位被泄露(即,可以在没有密钥的情况下访问)。
将相同的想法应用于OR,我们看到每次在加密字节中找到'0'时,我们都知道输入(即纯文本)也必须是'0'。如果我们找到'1',那么我们不知道输入是'0'还是'1'。因此,我们可以得出结论输入纯文本是:_ 00 _ 0 _ _ _。这次我们能够泄漏原始纯文本字节的3位而不知道密钥的任何信息。
最后,使用XOR,我们无法获得原始明文字节的任何位。每当我们在加密字节中看到'1'时,'1'就可以从'0'或'1'生成。同样的事情是'0'(它可能来自'0'或'1')。因此,原始明文字节中没有泄漏任何一个比特。
答案 2 :(得分:32)
主要原因是如果具有未知分布R1的随机变量与具有均匀分布的随机变量R2进行异或,则结果是具有均匀分布的随机变量,因此基本上您可以容易地随机化偏置输入,这是其他方法无法实现的。二元运算符。
答案 3 :(得分:26)
XOR的输出始终取决于两个输入。对于您提到的其他操作,情况并非如此。
答案 4 :(得分:6)
我认为因为XOR是可逆的。如果你想创建哈希,那么你将要避免异或。
答案 5 :(得分:6)
XOR是唯一直接使用的门,因为无论输入是什么,另一个输入总是对输出产生影响。
但是,它不是加密算法中使用的唯一门。老式密码学可能也是如此,这种类型涉及大量的比特混洗,XOR和旋转缓冲,但对于基于素数的加密,你需要各种不通过XOR实现的数学。
答案 6 :(得分:4)
XOR的作用类似于切换开关,您可以在其中打开和关闭特定位。如果你想“加扰”一个数字(一个比特模式),你用一个数字对它进行异或。如果您使用相同的号码获取该加扰号码并再次对其进行异或,则返回原始号码。
210 XOR 145 gives you 67 <-- Your "scrambled" result
67 XOR 145 gives you 210 <-- ...and back to your original number
当您使用XOR“加扰”数字(或文本或任何模式的位)时,您拥有大量加密的基础。
答案 7 :(得分:3)
XOR比更复杂的操作(例如ADD,MUL)使用更少的晶体管(4 NAND gates),这使得当门数很重要时可以在硬件中实现。此外,XOR是它自己的逆,这使得它适用于应用密钥材料(相同的代码可用于加密和解密)AES的简单AddRoundKey操作就是一个例子。
答案 8 :(得分:2)
对于对称加密,将比特与密码混合并且不增加长度的唯一实际选择操作是带有进位的操作,无进位加(XOR)和比较(XNOR)。任何其他操作都会丢失位,扩展或在CPU上不可用。
答案 9 :(得分:2)
让我们考虑三个常见的按位逻辑运算符
假设我们可以选择一些数字(让我们称之为掩码)并将其与未知值结合起来
无论您选择哪种掩码,XOR都会更加微妙,无法确定结果的任何位值。但是,如果你将面具两次,你会收回你的初始值。
换句话说,AND和OR的目的是删除一些信息,这绝对不是你想要的加密算法(对称或非对称密码或数字签名)。如果您丢失信息,您将无法收回信息(解密)或签名将容忍信息的一些微小变化,从而破坏了它的目的。
所有这一切,加密算法都是如此,而不是它们的实现。大多数加密算法的实现也使用许多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
答案 10 :(得分:2)
XOR属性(a xor b)xor b = a 对于流密码非常有用:为了加密位宽数据,使用加密密钥生成n位的伪随机序列和加密算法。
Sender: Data: 0100 1010 (0x4A) pseudo random sequence: 1011 1001 (0xB9) ------------------ ciphered data 1111 0011 (0xF3) ------------------ Receiver: ciphered data 1111 0011 (0xF3) pseudo random sequence: 1011 1001 (0xB9) (receiver has key and computes same sequence) ------------------ 0100 1010 (0x4A) Data after decryption ------------------
答案 11 :(得分:1)
我认为这仅仅是因为给定一些随机的二进制数集,大量的“OR”运算倾向于所有的'1',同样大量的'AND'运算倾向于全零。当大量的'XOR'产生随机选择的1和0时。
这并不是说AND和OR没用 - 只是XOR更有用。
密码学中OR / AND和XOR的普遍存在有两个原因: -
其中一个是闪电般快速的指示。
两个很难使用传统的数学公式进行建模
答案 12 :(得分:1)
XOR是密码术中的数学计算。这是一个逻辑操作。还有其他逻辑运算:“与”,“或”,“非”,“模函数”等。“异或”是最重要和最常用的。
如果相同,则为0。
如果不同,则为1。
示例:
消息:您好
Hello的二进制版本:01001000 01100101 01101100 01101100 01101111
密钥流:110001101010001101011010110011010010010111
使用XOR的密文:10001110 11000110 00110110 10100001 01001010
应用程序:一次性键盘/ Vern-am密码使用互斥或功能,其中接收者具有相同的密钥流,并通过秘密传输通道接收密文。接收者然后将密文与密钥流异或以揭示Hello的明文。在One Time Pad中,密钥流应至少与消息一样长。
事实:“一键通”是唯一真正坚不可摧的加密。
排他性或用于分密码DES算法中的Feistel结构。
注意:XOR运算有50%的机会输出0或1。