代码之家  ›  专栏  ›  技术社区  ›  Paul

XOR加密有什么问题?

  •  49
  • Paul  · 技术社区  · 16 年前

    我写了一个简短的C++程序来对文件进行XOR加密,我可以用它来处理一些个人文件(如果它被破解了,这没什么大不了的——我只是在保护不经意的观众)。基本上,我使用一个ASCII密码,并将文件中的数据重复XOR密码。

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

    12 回复  |  直到 16 年前
        1
  •  112
  •   Pavel Minaev    16 年前

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

    二进制文件可能更糟,因为它们通常包含 0x00 字节。显然,XORing与那些是没有操作的,所以您的密码将在输出中以纯文本显示!一个非常常见的二进制格式具有长的空序列的例子是 .doc .

        2
  •  66
  •   Community CDub    8 年前

    我同意。 Pavel Minaev's explanation Xor的弱点。对于那些感兴趣的人,下面是在几分钟内打破简单XOR加密的标准算法的基本概述:

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

    2. 如果相等的字节为 大于一定百分比 (占6% 布鲁斯施耐尔的 应用密码学第二 版本 ,然后您已经将 以键长的倍数表示的数据。 通过找到 移动会导致 相等字节的数量,您会发现 密钥长度。

    3. 将密码文本移动 keylength和xor。 这会删除密钥并离开您 纯文本与 纯文本移动了 关键。 应该有足够的 明文决定消息 内容。

    更多阅读 Encryption Matters, Part 1

        3
  •  22
  •   SingleNegationElimination    16 年前

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

    • 纯文本和密码的长度大致相同。
    • 密码不能用于加密多封邮件。
    • 密码不能被猜出来.实际上,这意味着位是随机的。

    *相当强的意思是它不能被琐碎的数学方法打破,如在geneq的文章中。它仍然不比您的密码强。

        4
  •  12
  •   laalto    16 年前

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

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

    在这里,明文互相抵消,只留下钥匙。

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

        5
  •  6
  •   Lance Summers    13 年前

    使XOR工作的方法:

    使用多个键,每个键的长度等于质数,但键的长度绝不相同。 使用原始文件名作为另一个键,但记住要创建一个检索文件名的机制。然后创建一个扩展名为的新文件名,该扩展名会让您知道它是一个加密文件。 使用素数长度的多个键的原因是,它们会导致产生的XOR键的长度是键A乘以键B,然后再重复。 在对文件进行加密之前,将所有重复模式从文件中压缩出来。 生成一个随机数,每X偏移一次XOR这个数(记住,这个数也必须是可重新创建的。您可以使用文件长度的随机种子。

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

    对于密钥,文件名是一个(包括完整路径),str(文件大小)+str(文件日期)+str(日期)+str(时间),随机生成密钥,您的全名,一次创建的私钥。

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

    这应该可以防止像图片和音乐这样的文件上的重复模式,但是电影,长度为四个或更多,可能仍然很脆弱,所以可能需要第六个键。

    我个人在记忆棒上加密了DAT文件(用于Microsoft Access的DAT文件)。我使用了一个3键方法来加密它,因为它永远不会这么大,它是一个包含相关键的文件目录。

    多个键而不是随机生成一个非常大的键的原因是素数乘以素数会很快变大,我对键的创建有一定的控制权,你知道实际上没有真正的随机数。如果我创建了一个大的随机数,其他人就可以生成相同的数。

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

    因为键的长度不同,所以对每个键重复的重叠是不同的,因此创建一个派生键,即键的长度,一次键的长度,二次键的长度。对于其余的键,此逻辑重复。质数的原因是,重复会发生在键长度的除法上,因此您希望除法为1或键的长度(母鸡、质数)。

    当然,这不仅仅是文件上的一个简单的XOR,但是概念是相同的。

    兰斯

        6
  •  3
  •   John Smith    16 年前

    我只是在保护自己不被随便的观众看到

    只要这个假设成立,您的加密方案就可以了。那些认为InternetExplorer是“因特网”的人是无法打破它的。

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

        7
  •  2
  •   nik    16 年前

    A的目标 good encryption 就是让它 数学上的 没有密钥很难解密。
    这包括保护密钥本身的愿望。
    这个 XOR technique 基本上是一个非常简单的密码,如这里所描述的,很容易破解。

    需要注意的是,在 cryptographic algorithms .
    这些算法致力于引入围绕它的数学难度。

        8
  •  2
  •   Chris Arguin    16 年前

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

    如果您只想停止临时的查看器,这就足够了;我曾经将字符串隐藏在可执行文件中。然而,对于任何一个真正尝试的人来说,它都站不住10分钟。

    这就是说,现在有很多更好的加密方法随时可用,所以为什么不利用自己更好的东西呢。如果你只是想躲开“临时”用户,即使是像gzip这样的东西也能做得更好。

        9
  •  2
  •   Phil M    14 年前

    另一个技巧是为密码生成一个md5()散列。您可以使用受保护文本的长度作为偏移量,或者将其与密码组合,以便为短短语提供更好的分布,从而使其更加独特。对于长短语,通过将每个16字节块与前一个哈希组合,使整个XOR键“随机”且不重复,来发展MD5()哈希。

        10
  •  1
  •   Michael Howard-MSFT    15 年前

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

        11
  •  1
  •   BlueRaja - Danny Pflughoeft    15 年前

    我是 小的 回答晚了,但由于还没有人提到:这被称为守夜密码。

    维基百科给出了 cryptanalysis attacks 更简单的是,由于大多数文件格式都有一个固定的头文件,所以将使用加密头文件对明文头文件进行异或处理,从而为您提供密钥。

        12
  •  1
  •   Jeff Dege    15 年前

    “gt;6%”geneq提到的是英文电报文本的符合索引-26个字母,标点和数字拼写出来。长文本的实际值为0.0665。

    <4%是26个字符字母表中随机文本的符合指数,即1/26或0.385。

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

    一旦将文本与自身异或,剩下的就相当于一个自动密钥密码。维基百科有一个很好的破译密码的例子。

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