【问题标题】:What's wrong with XOR encryption?XOR 加密有什么问题?
【发布时间】:2010-11-11 05:37:36
【问题描述】:

我编写了一个简短的 C++ 程序来对一个文件进行 XOR 加密,我可以将它用于一些个人文件(如果它被破解也没什么大不了的——我只是防止偶然的观众)。基本上,我使用 ASCII 密码,并反复将密码与文件中的数据进行异或。

不过,现在我很好奇:如果有人想破解这个,他们会怎么做?会不会需要很长时间?它是否取决于密码的长度(即,什么是大 O)?

【问题讨论】:

  • 或者你可以分解并使用 TrueCrypt 之类的东西...

标签: security encryption xor


【解决方案1】:

XOR 加密的问题在于,对于相同字符的长时间运行,很容易看到密码。如此长的运行最常见的是文本文件中的空格。假设您的密码是 8 个字符,并且文本文件的某行中有 16 个空格(例如,在 ASCII 图形表的中间)。如果你只是用你的密码异或,你会看到输出将有重复的字符序列。攻击者只会寻找任何此类,尝试猜测原始文件中的字符(空格将是第一个尝试的候选者),并从重复组的长度推导出密码的长度。

二进制文件可能更糟,因为它们通常包含0x00 字节的重复序列。显然,与这些进行异或运算是无操作的,因此您的密码将在输出中以纯文本形式显示! .doc 是一个非常常见的具有长空序列的二进制格式示例。

【讨论】:

  • 请注意,用空格字符异或整个文件几乎是微不足道的,此时任何有意义的字符串都会作为可能的密码跳出来。对于与 ASCII 字符串异或的二进制文件,结果中的任何字符串 都是 密码。 shell 提示符下的字符串命令会找到它们。
  • FWIW 您应该清楚,当“密钥”小于明文时,您正在谈论 XOR 方案。如果密钥与明文大小相同,并且“真正”随机(至少来自攻击者的 POV),则它是 OTP;又名牢不可破。
  • 很好的解释。但是如果密码与明文长度相同,XOR 不能更安全吗?
  • 见上面的评论。是的,如果你有一次性密码(长度相同,加密质量随机),那么 XOR 就非常好。
  • @NoonSilk - 您是否知道将小密码输入密钥派生函数以生成纯文本大小的密钥的任何方法?这会使 XOR 安全快速吗? KDF 很慢,但是如果想要生成一个 1MBit 大小的密钥,是否可以减少 KDF 上的迭代并保证安全?
【解决方案2】:

我同意 XOR 的弱点 Pavel Minaev's explanation。对于那些感兴趣的人,这里是用于在几分钟内破解普通 XOR 加密的标准算法的基本概述:

  1. 确定密钥的长度。 这个 通过对加密数据进行异或运算来完成 with 自己移动了各种数字 的地方,并检查有多少 字节相同。

  2. 如果相等的字节是 大于一定百分比 (根据布鲁斯·施奈尔的 6% 应用密码学第二 版),那么您已将 数据的密钥长度的倍数。 通过找到最小数量的 转移,导致大 相等的字节数,你会发现 密钥长度。

  3. 将密文移动 密钥长度,并与自身进行异或。 这会移除钥匙并离开你 与明文异或 明文移动了长度 关键。应该够了 明文判断消息 内容。

阅读更多Encryption Matters, Part 1

【讨论】:

  • 你能解释一下第 3 部分吗?我已经尝试过了,但它似乎不起作用。例如,如果我以十进制数字执行此操作。纯文本是 23456,密钥是 12,密码是 31577 然后 XOR 给我乱码
  • 请注意,截至 2020 年 2 月 7 日,http://www.kuro5hin.org/?op=displaystory&sid=2000/4/10/174741/423 URL 似乎不再可用 - 该域似乎正在出售。但是,您可以通过 Encryption Matters, Part 1 找到有关 WayBack 机器(Internet 存档)的原始文章。
【解决方案3】:

如果满足以下条件,XOR 加密可以相当*强:

  • 明文和密码长度差不多。
  • 密码不会重复用于加密多条消息。
  • 密码无法通过字典或其他数学方式猜出,即IE。实际上,这意味着位是随机的。

*合理的强意味着它不能被微不足道的数学方法破坏,如 GeneQ 的帖子。它仍然不比您的密码强。

【讨论】:

  • 对于一次性密码,密钥必须与明文长度相同。如果这是真的,并且密钥永远不会被重复使用,那么一次性密码本绝对是安全的。如果您对密码学的历史感兴趣,我强烈推荐 David Kahn 的 The Codebreakers:amazon.ca/…
  • “相当安全” - 永远不能以任何方式破坏一次垫(假设垫是完全随机的)。它们是唯一绝对安全的加密方法。
  • 一次性密码本并非绝对安全;它仅与加密端和解密端之间共享pad的方法一样安全。
【解决方案4】:

除了已经提到的几点,XOR 加密完全容易受到已知明文攻击:

cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext

XORring 明文相互抵消,只留下密钥。

对于任何“安全”加密方法而言,不易受到已知明文攻击是必需的,但还不够充分,其中相同的密钥用于多个明文块(即一次性密码仍然是安全的)。

【讨论】:

  • +1 值得一提的是,即使文件的一小部分已知(例如大多数文件格式使用的标头),也可以轻松获得密钥并解密整个文件。
【解决方案5】:

使 XOR 工作的方法:

使用多个密钥,每个密钥长度等于一个质数,但密钥长度绝不相同。 使用原始文件名作为另一个键,但请记住创建检索文件名的机制。然后创建一个带有扩展名的新文件名,让您知道它是一个加密文件。 使用多个素数长度的密钥的原因是它们导致生成的 XOR 密钥在重复之前的长度是密钥 A 乘以密钥 B。 在加密之前压缩文件中的任何重复模式。 生成一个随机数并在每个 X 偏移量处对这个数字进行异或(请记住,这个数字也必须是可重新创建的。您可以使用文件长度的 RANDOM SEED。

完成所有这些操作后,如果您使用 5 个长度为 31 或更大的密钥,您最终的密钥长度将约为 100 兆!

对于密钥,Filename 为一(包括完整路径),STR(Filesize) + STR(Filedate) + STR(Date) + STR(Time),Random Generation Key,您的全名,一次创建的私钥.

用于存储用于每个加密文件的密钥的数据库,但将 DAT 文件保存在 USB 记忆棒上而不是计算机上。

这应该可以防止图片和音乐之类的文件出现重复模式,但长度为四场或更多的电影可能仍然容易受到攻击,因此可能需要第六个密钥。

我个人在记忆棒上加密了 dat 文件(用于 Microsoft Access 的 Dat 文件)。我使用 3-Key 方法对其进行加密,因为它永远不会那么大,它是一个包含相关密钥的文件目录。

使用多个密钥而不是随机生成一个非常大的密钥的原因是素数乘以素数很快就会变大,我对密钥的创建有一些控制,你知道确实没有真正的随机数这样的东西.如果我创建了一个大的随机数,其他人可以生成相同的数字。

使用密钥的方法:用一个密钥加密文件,然后用下一个,然后再下一个,直到所有密钥都用完。每个密钥都被反复使用,直到整个文件都被该密钥加密。

因为密钥的长度不同,重复的重叠对于每个密钥都是不同的,因此创建了一个密钥一次密钥二的长度的派生密钥。其余键重复此逻辑。使用素数的原因是重复会发生在密钥长度的除法上,因此您希望除法为 1 或密钥的长度,hense,素数。

好的,当然,这不仅仅是对文件的简单异或,但概念是相同的。

兰斯

【讨论】:

    【解决方案6】:

    我只是在防止普通观众观看

    只要这个假设成立,你的加密方案就可以了。认为 Internet Explorer 是“互联网”的人是无法打破它的。

    如果没有,请使用一些加密库。对称加密已经有很多好的算法,比如 Blowfish 或 AES。

    【讨论】:

      【解决方案7】:

      good encryption 的目标是使其在数学上在没有密钥的情况下难以解密。
      这包括保护密钥本身的愿望。
      XOR technique 基本上是一个非常简单的密码,如此处所述很容易被破解。

      需要注意的是,XOR 在cryptographic algorithms 中使用。
      这些算法致力于引入数学难度。

      【讨论】:

        【解决方案8】:

        Norton 的防病毒软件曾经使用一种技术,即使用前一个未加密的字母作为下一个字母的密钥。如果我没记错的话,我又花了半个小时才弄清楚。

        如果您只是想阻止普通观众,那就足够了;我曾经在可执行文件中隐藏字符串。然而,对于任何真正尝试过的人来说,它不会站起来 10 分钟。

        总而言之,现在有很多更好的加密方法可供使用,所以为什么不利用更好的方法。如果您只是想对“休闲”用户隐藏,那么即使 gzip 之类的东西也会做得更好。

        【讨论】:

          【解决方案9】:

          另一个技巧是为您的密码生成一个 md5() 哈希。您可以通过使用受保护文本的长度作为偏移量或将其与您的密码相结合以更好地分配短短语,从而使其更加独特。对于长短语,通过将每个 16 字节块与前一个哈希组合来改进您的 md5() 哈希 - 使整个 XOR 密钥“随机”且不重复。

          【讨论】:

            【解决方案10】:

            RC4 本质上是 XOR 加密!与许多流密码一样 - 密钥就是密钥(没有双关语!)您绝不能重复使用密钥。永远!

            【讨论】:

              【解决方案11】:

              我回答得有点晚了,但是因为还没有人提到它:这被称为 Vigenère 密码。

              维基百科给出了一些cryptanalysis attacks来破解它;不过,更简单的是,由于大多数文件格式都有固定的标头,因此将明文标头与加密标头进行异或运算,从而为您提供密钥。

              【讨论】:

                【解决方案12】:

                GeneQ 提到的“>6%”是英文电报文本的巧合指数 - 26 个字母,标点符号和数字都拼出来。长文本的实际值为 0.0665。

                如果您使用不同的语言或不同的字母表,具体值会有所不同。如果您使用 ASCII 字符集、Unicode 或二进制字节,则具体值将大不相同。但是明文IC和随机文本IC之间通常会存在差异。 (压缩后的二进制文件的 IC 可能非常接近随机的 IC,任何用任何现代计算机密码加密的文件都会有一个与随机文本完全相同的 IC。)

                将文本与自身进行异或后,剩下的就相当于自动密钥密码。维基百科有一个破解这种密码的好例子

                http://en.wikipedia.org/wiki/Autokey_cipher

                【讨论】:

                  【解决方案13】:

                  如果您想继续使用 XOR,您可以轻松地使用多个不同的盐(在哈希之前添加到密码中的字符串)对密码进行哈希处理,然后将它们组合以获得更大的密钥。 例如。使用带有 64 个唯一盐的 sha3-512,然后使用每个盐对您的密码进行哈希处理,以获得一个 32768 位密钥,您可以使用它来加密 32Kib (Kilibit) (4KiB (kilibyte)) 或更小的文件。在现代 CPU 上,多次散列应该不到一秒。 为了更安全,您可以尝试在 AES (Rijndael) 等加密期间操作您的密钥。 AES 实际上会执行 XOR 时间,并使用开关表在每次重复密钥时修改密钥。它已成为国际标准,因此非常安全。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-08-26
                    • 2012-06-14
                    • 1970-01-01
                    • 2017-08-02
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多