【问题标题】:Why is XOR used in cryptography?为什么在密码学中使用 XOR?
【发布时间】:2010-11-25 16:22:43
【问题描述】:

为什么密码算法只使用异或,而没有使用其他逻辑门,如 OR、AND 和 NOR?

【问题讨论】:

  • 是什么让你认为是这样的?
  • 你是想问“为什么密码算法只使用异或?”我在其他地方使用过 XOR...
  • Austin,他并不是说 XOR 没有在其他地方使用,而是 XOR 是唯一一种用作加密方法的方法
  • Keccak(现在是 SHA-2)使用 XOR、NOT、AND 和 ROT。
  • @Xz_awan 这不是加密算法。它是一个 cryptographic 散列函数,因此是一个 cryptographic 算法。 SHA-2 压缩函数是从分组密码构建的。 |但我在上面的评论中犯了一个错误,我想说“Keccak(now SHA-3) ...”。与 Keccak 不同的是,SHA-2 在上述操作之外还使用了 ADD。

标签: encryption cryptography


【解决方案1】:

说逻辑运算 XOR 是所有密码学中唯一使用的操作并不完全正确,但它是唯一使用它的双向加密。

解释如下:

假设你有一串二进制数字10101 然后你用它对字符串10111 进行异或,你得到00010

现在您的原始字符串已被编码,第二个字符串成为您的密钥 如果你用你的编码字符串异或你的密钥,你会得到你的原始字符串。

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

如果你有一个更长的字符串,你可以重复你的键,直到它足够长 例如,如果您的字符串是 1010010011,那么您只需将密钥写入两次,它将变为 1011110111 并与新字符串异或

这是wikipedia link on the XOR cipher.


【讨论】:

  • “如果你有一个更长的字符串,你可以重复你的键直到它足够长” - 你能详细说明一下吗?我认为随着模式开始出现,简单地重复密钥来加密更大的文本是一个非常糟糕的主意。
  • @Tiago:当然,如果这在任何真正意义上都应该是安全的,那么重复密钥是一个糟糕的主意。使用 XOR 进行安全通信的经典方法是使用“一次性密码”。您和您正在与之通信的人拥有一个任意长度的笔记本的相同副本,其中包含随机位。您可以根据需要对发送一条消息的位进行异或运算,然后立即烧掉该垫的那一部分,不再使用。在大多数情况下,这在逻辑上是不可行的,因此在实践中需要更聪明的方法。 XOR 密码可以成为更好技术的构建块。
【解决方案2】:

我可以看到两个原因:

1)(主要原因)异或不会泄露原始明文的信息。

2)(很好的理由)XOR 是involutory function,即,如果你应用两次 XOR,你会得到原始明文(即XOR(k, XOR(k, x)) = x,其中x 是你的明文,@ 987654324@ 是您的密钥)。内异或是加密,外异或是解密,即加密和解密都可以使用完全相同的异或函数。

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

0 和 0 = 0

0 AND 1 = 0

1 和 0 = 0

1 AND 1 = 1(泄漏!)

或者

0 OR 0 = 0(泄漏!)

0 或 1 = 1

1 或 0 = 1

1 或 1 = 1

异或

0 异或 0 = 0

0 异或 1 = 1

1 异或 0 = 1

1 异或 1 = 0

第一列的所有内容都是我们的输入(即纯文本)第二列是我们的密钥最后一列是您的输入与使用特定操作(即密文)的密钥“混合”(加密)的结果

现在,假设攻击者访问了某个加密字节,例如:10010111,并且他想要获取原始明文字节。

假设使用 AND 运算符从原始明文字节生成此加密字节。如果使用了 AND,那么我们可以肯定地知道,每次我们在加密字节中看到位“1”时,根据真值表,输入(即第一列,纯文本)也必须为“1”和。如果加密位是“0”,我们不知道输入(即纯文本)是“0”还是“1”。因此,我们可以得出原始明文为:1 _ _ 1 _ 111​​。因此,原始明文的5位被泄露(即,可以在没有密钥的情况下访问)。

将相同的想法应用于 OR,我们看到每次在加密字节中找到一个“0”,我们就知道输入(即纯文本)也必须是一个“0”。如果我们找到“1”,那么我们不知道输入是“0”还是“1”。因此,我们可以得出结论,输入的纯文本为:_00_0____。这次我们能够在不知道密钥的情况下泄露原始纯文本字节的 3 位。

最后,通过异或,我们无法得到原始明文字节的任何位。每次我们在加密字节中看到“1”时,该“1”可能是从“0”或“1”生成的。与“0”相同(它可能来自“0”或“1”)。因此,原始明文字节没有泄漏一个位。

【讨论】:

    【解决方案3】:

    主要原因是,如果一个具有未知分布的随机变量 R1 与一个具有均匀分布的随机变量 R2 进行异或运算,则结果是一个具有均匀分布的随机变量,所以基本上你可以很容易地随机化一个有偏差的输入,而这是其他方法无法做到的二元运算符。

    【讨论】:

    • 这一点非常重要——因为它适用于消息中的任何位分布。密文中的比特始终是均匀分布的,确保不能使用频率分析等统计密码分析技术破解密码。
    • 您需要 R1 和 R2 是独立的,以使结果一致(简单的反例:R1 = R2)。
    • @rlandster 正确,但我从未提到他们依赖?它们是随机的 + R1 可能有偏差,但理论上 R2 是纯随机的
    • 这是最好的答案。 R1 根本不需要是随机的,R1 可以等于 R2。只要 R2 是随机的,结果就与随机无法区分。这就是 XOR 是宠儿的原因。
    【解决方案4】:

    XOR 的输出总是取决于两个输入。您提到的其他操作并非如此。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 哈希没有理由避免可逆操作。通常哈希函数的主要部分是可逆的,并且只有在最后才应用不可逆操作。通常,这种不可逆的操作完全由 XOR 组成。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        XOR 就像一个拨动开关,您可以在其中打开和关闭特定位。如果你想“打乱”一个数字(一种位模式),你可以用一个数字对它进行异或。如果您取那个加扰的数字并用相同的数字再次对它进行 XOR,您会恢复原来的数字

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

        当您使用 XOR 对数字(或文本或任何位模式)“加扰”时,您就拥有了很多密码学的基础。

        【讨论】:

          【解决方案8】:

          XOR 使用的晶体管 (4 NAND gates) 比更复杂的操作(例如 ADD、MUL)更少,这使得当门数很重要时,它可以很好地在硬件中实现。此外,XOR 是其自身的逆运算,这使其适用于应用密钥材料(相同的代码可用于加密和解密) AES 的精美简单的AddRoundKey 操作就是一个例子。

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 在普通 CPU 上有更多的可逆指令可用:旋转是一种,整数乘以奇数是另一种。所有这些都用于一些现代分组密码中。
            • 我省略了轮换,因为它本身并不适合加密。我永远不会猜到奇数乘法是可逆的。
            【解决方案10】:

            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) 解密后的数据 ------------------

            【讨论】:

              【解决方案11】:

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

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

              • 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,如果我数对了

              【讨论】:

                【解决方案12】:

                XOR 是密码学中的数学计算。这是一个逻辑运算。还有其他逻辑运算:AND、OR、NOT、Modulo Function 等。XOR 是最重要也是最常用的。

                如果相同,则为 0。

                如果不同,则为 1。

                例子:

                消息:你好

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

                密钥流:110001101010001101011010110011010010010111

                使用异或的密文:10001110 11000110 00110110 10100001 01001010

                应用:一次性密码/Vern-am Cipher 使用 Exclusive or 功能,其中接收器具有相同的密钥流并通过隐蔽的传输通道接收密文。接收者然后将密文与密钥流进行异或运算,以显示 Hello 的明文。在 One Time Pad 中,密钥流应至少与消息一样长。

                事实:One Time Pad 是唯一真正牢不可破的加密。

                在分组密码DES算法中使用的Feistel结构中使用异或。

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

                【讨论】:

                  【解决方案13】:

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

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

                  OR/AND 和 XOR 在密码学中的流行有两个原因:-

                  这些是闪电般快速的指令。

                  两个它们很难用传统的数学公式建模

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-12-05
                    • 2010-11-11
                    • 2019-01-19
                    • 1970-01-01
                    • 2012-05-19
                    相关资源
                    最近更新 更多