为什么在加密中使用XOR?


76

为什么在加密算法中仅使用XOR,而未使用OR,AND和NOR等其他逻辑门?


6
是什么让您认为情况如此?
skaffman

1
您是否要问“为什么加密算法仅使用XOR?” 我在其他地方使用过XOR ...
Austin Salonen

3
奥斯汀,他并不是说没有在其他地方使用XOR,而是XOR是唯一一种用于加密的方法

1
Keccak(现为SHA-2)使用XOR,NOT,AND和ROT。
CodesInChaos 2012年

1
@Xz_awan这不是加密算法。这是一个加密哈希函数,因此是一个加密算法。SHA-2压缩功能是根据分组密码构建的。| 但是我在上面的评论中犯了一个错误,我想说“ Keccak(现在为SHA-3)...”。与Keccak不同,SHA-2在上述操作之外还使用ADD。
CodesInChaos

Answers:


70

逻辑运算XOR是所有加密中唯一使用的逻辑运算,这并不是完全正确的说法,但是,逻辑运算XOR是专门用于加密的唯一两种方式。

解释如下:

假设您有一串二进制数字,10101 然后将其10111与XOR00010

现在您的原始字符串已编码,如果您将密钥与编码的字符串进行XOR运算,则第二个字符串将成为您的密钥,您将获得原始字符串。

XOR使您可以轻松地对字符串进行加密和解密,而其他逻辑操作则不能。

如果您有一个更长的字符串,您可以重复您的密钥,直到它足够长为止,例如,如果您的字符串是1010010011那么,您只需简单地写两次密钥,密钥就会变成1011110111新的字符串并与之异或

这是XOR密码上的Wikipedia链接。



“如果您有更长的字符串,您可以重复输入密钥,直到足够长为止”-您能否详细说明一下?我认为,随着模式开始出现,仅重复密钥以加密较大的文本是一个非常糟糕的主意。
Tiago

@Tiago:当然,如果从任何实际意义上讲这是安全的,那么重复密钥是一个糟糕的主意。与XOR进行安全通信的经典方法是使用“一个时间垫”。您和您与之交流的人拥有一本任意长的笔记本的相同副本,并带有随机位。您可以根据需要对多个位进行XOR,以发送一条消息,并在此之后立即烧掉那部分填充垫,从此不再使用。从逻辑上讲,这在大多数时候是不可行的,因此在实践中需要更巧妙的方法。XOR密码可以成为更好技术的基础。
约书亚·斯旺森

45

我可以看到2个原因:

1)(主要原因)XOR不会泄漏有关原始明文的信息。

2)(有必要的理由)XOR是强制函数,即,如果两次应用XOR,则会返回原始的纯文本(即XOR(k, XOR(k, x)) = x,哪里x是您的明文并且k是您的密钥)。内部XOR是加密,外部XOR是解密,即,完全相同的XOR函数可用于加密和解密。

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

0 AND 0 = 0

0 AND 1 = 0

1 AND 0 = 0

1 AND 1 = 1(泄漏!)

要么

0 OR 0 = 0(泄漏!)

0或1 = 1

1或0 = 1

1或1 = 1

异或

0 XOR 0 = 0

0 XOR 1 = 1

1 XOR 0 = 1

1 XOR 1 = 0

在一切都第一列是我们的输入(即纯文本)。在第二列是我们的关键最后一列是你输入的结果与使用的具体操作的关键“混合”(加密)(即密文)

现在,假设攻击者可以访问某个加密字节,例如:10010111,而他想要获得原始的纯文本字节。

假设使用AND运算符是为了从原始明文字节生成此加密字节。如果使用AND,则可以确定,每次看到加密字节中的位“ 1”时,输入(即第一列,纯文本)也必须按照“ 1”的真值表也为“ 1”。和。如果加密位是“ 0”,则我们不知道输入(即纯文本)是“ 0”还是“ 1”。因此,我们可以得出以下结论:原始纯文本为:1 _ 1 _111。因此,原始纯文本的5位被泄漏(即,无需密钥就可以访问)。

将相同的思想应用于OR,我们看到,每次在加密字节中找到“ 0”时,我们都知道输入(即纯文本)也必须为“ 0”。如果找到“ 1”,则不知道输入是“ 0”还是“ 1”。因此,我们可以得出结论,输入的纯文本为:_ 00 _ 0 _ _ _。这次,我们能够泄漏原始纯文本字节的3位,而无需了解密钥。

最后,使用XOR,我们无法获得原始明文字节的任何位。每当我们在加密字节中看到“ 1”时,就可能是从“ 0”或“ 1”生成了“ 1”。带有“ 0”的东西(可能来自“ 0”或“ 1”)。因此,不会从原始明文字节泄漏任何一位。


34

主要原因是,如果将未知分布R1的随机变量与均匀分布的随机变量R2进行XOR运算,结果将是均匀分布的随机变量,因此基本上您可以轻松地对有偏输入进行随机化,这是其他二元运算符无法实现的。


1
这一点非常重要-因为它适用于消息中的任何位分配。密文中的位将始终均匀分布,确保不会使用统计密码分析技术(例如频率分析)来破坏密文。
mistertim

1
您需要R1和R2相互独立才能使结果一致(简单的反例:R1 = R2)。
rlandster 2014年

@rlandster是正确的,但我从未提及他们是依赖人吗?他们是随机的+ R1可能有偏差,但R2在
理论上

2
这是最好的答案。R1完全不需要是随机的,R1可以等于R2。只要R2是随机的,结果就和随机是无法区分的。这就是为什么XOR是宠儿。
Jim Flood

27

XOR的输出始终取决于两个输入。您提到的其他操作不是这种情况。


6

我认为是因为异或是可逆的。如果要创建哈希,则要避免XOR。


没有理由为什么哈希应该避免可逆操作。通常,哈希函数的主要部分是可逆的,并且仅在最后应用不可逆的操作。通常,不可逆操作完全由XOR构成。
CodesInChaos

6

XOR是唯一直接使用的门,因为无论一个输入是什么,另一输入始终会对输出产生影响。

但是,它不是密码算法中使用的唯一门。对于老式的密码学来说可能是正确的,这种类型的密码学涉及大量的比特混洗,XOR和旋转缓冲区,但是对于基于素数的密码,您需要各种无法通过XOR实现的数学。


4

XOR就像拨动开关一样,您可以在其中打开和关闭特定位。如果要“加扰”一个数字(一种位模式),可以将其与一个数字进行异或。如果您使用该加扰的数字,然后再次对该数字进行异或运算,则会得到原始数字

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

当您使用异或“加扰”数字(或文本或任何位模式)时,您便具有许多密码学的基础。


3

更复杂的操作(例如ADD,MUL)相比,XOR使用更少的晶体管(4个NAND门),这使得在门数很重要的情况下以硬件实现非常好。此外,XOR是它自己的反函数,这使得它很适合应用密钥材料(可以将相同的代码用于加密和解密)。AES的精美简单的AddRoundKey操作就是一个例子。


2

对于对称密码,唯一将位与密码混合且不增加长度的真正选择操作是带进位加,无进位加(XOR)和比较(XNOR)的操作。任何其他操作要么丢失位,扩展,要么在CPU上不可用。


3
普通CPU上还有更多可逆指令:旋转为1,整数乘以奇数整数是另一种。所有这些都用于某些现代分组密码中。
ip科2009年

我省略了旋转,因为它本身并不真正适用于加密。我从未想过奇整数乘法是可逆的。
约书亚

2

XOR属性(a xor b)xor b = a适用于流密码:要加密一个位宽的数据,将使用加密密钥和加密算法生成n位的伪随机序列。

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

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

2

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

假设我们可以选择一些数字(我们称其为掩码)并将其与未知值组合

  • AND是关于将某些位强制为零(在掩码中设置为零的那些位)
  • OR是关于将某些位强制为1(在掩码中设置为1的那些位)

无论您选择哪种掩码,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


1

我认为这仅仅是因为给定的一组随机二进制数,大量的“或”运算将趋向于全“ 1”,同样,大量的“与”运算将趋向于全零。大量的“ XOR”会产生一个随机的1和0的选择。

这并不是说AND和OR没有用-只是XOR更有用。

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

其中之一是快速的闪电指令。

二,使用常规数学公式很难建模


1

XOR是密码术中的数学计算。这是一个逻辑操作。还有其他逻辑运算:“与”,“或”,“非”,“模函数”等。“异或”是最重要和最常用的。

在此处输入图片说明

如果相同,则为0。

如果不同,则为1。

例:

留言内容:您好

Hello的二进制版本:01001000 01100101 01101100 01101100 01101111

密钥流:110001101010001101011010110011010010010111

使用XOR的密文:10001110 11000110 00110110 10100001 01001010

应用程序:一次性密码板/ Vern-am密码使用互斥或​​功能,其中接收者具有相同的密钥流,并通过秘密传输通道接收密文。接收者然后将密文与密钥流异或以揭示Hello的明文。在“一个时间片”中,密钥流应至少与消息一样长。

事实:一次性密码是唯一真正坚不可摧的加密。

排他性或用于分密码DES算法中使用的Feistel结构。

注意:XOR运算有50%的机会输出0或1。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.