我是一名程序员,所以当我听到XOR时,会想到按位运算符(例如0110 ^ 1110 = 1000)。

在密码学中经常提到“ XOR”。这与按位运算符的XOR相同吗?如果是这样,它如何用于加密大量数据而不是仅加密整数?您是否需要“密码”与要加密的数据长度相同?

评论

简而言之,XOR表示如果其中之一说“否”,那就是“是”。唯一的办法是,如果两个都说“是”。

@iamnamrud来自google:XOR是“一个布尔运算符,它对两个变量进行运算,如果两个变量中的一个不是一个,则两个变量的值都不为1”。即:0 ^ 0 = 0、0 ^ 1 = 1、1 ^ 0 = 1、1 ^ 1 = 0

#1 楼

是的,它是相同的XOR。它在大多数算法中使用,或者仅用于合并流密码和明文。

一切都只是比特,甚至是文本。单词“ hello”是ASCII 01101000 01100101 01101100 01101100 01101111。只是普通位,分为5个字节。现在,您可以使用5个字节的随机字符串来加密此字符串,例如一次性垫。假设我们得到了随机生成的字符串10001001 10000010 00001011 01001101 11101101(由www.random.org生成)。现在我们对两个字符串进行XOR,得到11100001 11100111 01100111 00100001 10000010。如果您从不重用或透露密钥,则没有人可以破解此密码。 (嗯,我确实公开了密钥,所以它不再安全了。)

许多分组密码都使用XOR。让我们以AES为例:高级加密标准在单个字节上使用xor(其他一些算法使用16或32位的块; 8位以外的大小没有问题)。回合密钥将与中间结果进行异或,然后进行置换和替换。 XOR也被用于关键文件中。

IDEA还使用XOR作为其三个主要功能之一:XOR,加法和乘法。

XOR具有(尤其是)这些功能用于加密的优点:


非常快速的可计算性,尤其是在硬件中。
左右位置没有区别。 (可交换。)
XOR值的数量和顺序无关紧要。 (具有关联性)。
易于理解和分析。

当然,根据上下文的不同,某些“优势”可能是不利的。快速的速度使得经常使用XOR成为可能,而性能却不会大幅下降。 Threefish(另一个分组密码)的安全性取决于使用模加法和XOR交替进行的非线性。尽管使用了72次回合(作为哈希函数Skein的基础),但它仍然相当快。

单独的XOR不足以创建安全的块或流密码。您还需要其他元素,例如加法运算,S盒或同样长的随机位流。这是由于XOR运算本身的线性。如果没有非线性元素,密码很容易被破坏。请参阅为什么分组密码需要非线性分量(例如S-box)?有关为什么非线性很重要的更多详细信息。

评论


$ \ begingroup $
左侧为“边”。我没有在第一到最后一节中提到的缺点。
$ \ endgroup $
–马腾·博德威斯♦
18-09-30在2:59



$ \ begingroup $
也许值得强调XOR是它自己的逆,因为$ a =(a \ wedge b)\ wedge b $。因此,如果$ m $是消息,而$ k $是密钥,则$ k $既可以用来加密消息$ e = m \ wedge k $,也可以用来解密$ m = e \ wedge k $。
$ \ endgroup $
–sfmiller940
18/12/26在19:35



#2 楼

是的,用于加密的XOR意味着您熟悉的按位XOR运算符。

是的,要使用XOR(单独)安全地加密消息,您确实需要一个长的密钥作为消息。实际上,如果您具有这样的密钥(并且它是完全随机的,并且您永远不会重复使用它),那么证明的加密方案(称为一次性密码)将证明是坚不可摧的!

当然,在大多数情况下,使用如此长的键是非常不切实际的。相反,我们使用的技巧是从短键“即时”生成XOR键,基本上是通过使用短键播种合适的伪随机数生成器并将消息与生成器的输出进行XOR。

当然,要使该技巧发挥作用,攻击者没有任何简便的方法可以通过观察加密的消息(甚至是恢复消息)来恢复短密钥(或其他任何可以让他们预测生成器输出的东西)。生成器的原始输出,如果他们可以猜测或选择明文,则可以获取它们。大多数简单的常用RNG都不能承受此测试,但是我们确实拥有各种可以抵御此类攻击的生成器。

这种加密方案被称为(同步)流密码有关更多详细信息,请参见Wikipedia文章(和/或此处的stream-cipher标签)。

#3 楼

如果考虑密码,则密码的目的是将消息与秘密密钥组合在一起,从而隐藏消息而无需知道密钥(显然是数据)。例如,看一看旧的Caesar密码。

使用Caesar密码,您首先要枚举英文字母并提出一个秘密密码短语。要对消息进行加密,您可以将与消息字母相对应的数字添加到与密码短语相对应的数字,然后将结果数字解码回英文字母以获得加密的消息。如果结果数字> 26,则从字母开头循环。可以显示为:

$ E_n(x)=(x + n)\ mod 26 $

在这种情况下,我们执行加法模26。
但是由于在现代计算机上表示数据的最有效方法是二进制系统,因此密码算法也得到了发展,可以处理二进制编码的数据,而不是英语字母(它不仅可以处理英文单词,还可以处理通用数据) )。处理二进制数据时的加法运算意味着添加模2。现在,为了直观地理解为什么XOR在密码学中如此普遍,以至于在算术上下文中了解此运算的本质是有帮助的。

虽然布尔布尔代数中的XOR是一个排他的OR逻辑运算,但在算术上下文中,它只是2的加模。加法,每次我们需要组合两个二进制数据块(在许多密码中经常发生)时,都会使用加法。

评论


$ \ begingroup $
加法模256对于二进制Caesar密码非常有效-这不是使用XOR /加模2的好理由。
$ \ endgroup $
–马腾·博德威斯♦
18年9月30日在3:01

$ \ begingroup $
@MaartenBodewes使用模2的充分理由是效率,这在答案中已指定。凯撒密码只是一个示例,它展示了密码中经常使用加法(任何类型的加法),然后证明了XOR也是加法(只是模2),因为根据我的经验,程序员倾向于仅从布尔逻辑观点。
$ \ endgroup $
– zoresvit
18-09-30在4:45

$ \ begingroup $
@MaartenBodewes我指出的原因是,以上答案均未将XOR实质上描述为加法模2。然后,我尝试提出一个简单的示例,说明为什么经常使用加法。我愿意接受更好的例子:)
$ \ endgroup $
– zoresvit
18年9月30日在5:00