我注意到一些加密算法涉及对密钥使用 XOR 操作(即使 AES 使用 XOR 来派生轮密钥)。我的问题是为什么专门异或?OR或NAND或其他一些逻辑运算怎么样。我相信选择异或而不是其他逻辑运算是有原因的,但我真的不知道。
谢谢
我注意到一些加密算法涉及对密钥使用 XOR 操作(即使 AES 使用 XOR 来派生轮密钥)。我的问题是为什么专门异或?OR或NAND或其他一些逻辑运算怎么样。我相信选择异或而不是其他逻辑运算是有原因的,但我真的不知道。
谢谢
XOR 是一种可以随时取反的操作,所有信息都被保留。它是如此简单。使用 AND 和 OR 可能会导致信息丢失,因为您无法判断操作数中的某些位是 1 还是 0。
稍微玩一下 python repl,我们将使用 19 ( 10011
) 和 5 ( 101
),因为这些数字是很好的例子。
使用 OR 您会丢失有关哪些操作数具有特定位的信息:
>>> bin(19|5)
'0b10111'
不是19吗?是的,那是 19。得到的数字不能告诉我们它已经与 5 进行了 ORed。
使用 AND 是一样的:
>>> bin(19&5)
'0b1'
那是1。我们无法轻松恢复这两个数字(19或5),我们再次丢失了信息。
XOR 适用于加密工具,因为在 XORing 时不会丢失信息:
>>> bin(19^5)
'0b10110'
那是 22。显然这并不能告诉我们太多,但请看这个:
>>> bin(22^5)
'0b10011'
>>> bin(22^19)
'0b101'
您可以通过将 22 与另一个数字进行异或来恢复其中一个数字。这是一个非常原始的密钥概念。假设你和其他人可以有一个非常大的随机数列表(你们两个都有相同的数字),你可以简单地异或消息,然后在你们之间安全地交换。只要你们每次交流时使用不同的号码,这是一种安全的算法。该算法称为一次性填充。
XOR 用于密码学有两个主要原因:它是可逆的,例如,如果 A 与 B 的异或导致 C,那么 A 与 C 的异或将给出 B。与 AND & OR 不同,它使 0 和 1 的概率相等。如果使用 AND,则有 75% 的机会输出 0 和 25% 的 1,如果使用 OR,则有 75% 的机会输出 1 和 25% 的 0,因此 '1' 和 '0' 输出不是均匀分布的因此不会产生随机性。