XORencryption有什么问题?

我写了一个简短的C ++程序来对一个文件进行异或encryption,我可能会用它来处理一些个人文件(如果被破解,那没什么大不了的 – 我只是为了防止偶然的观众)。 基本上,我采取一个ASCII密码,并重复XOR密码与文件中的数据。

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

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

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

我赞同帕维尔·米纳耶夫(Pavel Minaev) 对 XOR弱点的 解释 。 对于那些有兴趣的人来说,下面是在几分钟内用来打破微不足道的XORencryption的标准algorithm的基本概述:

  1. 确定关键是多久。 这是通过对encryption的数据进行异或操作来完成的,它将不同数量的位置进行移位,并检查有多less个字节相同。

  2. 如果相等的字节大于一定比例(根据Bruce Schneier的Applied Cryptography第二版 ,则为6%),那么您已经将数据移位了密钥长度的倍数。 通过查找导致大量相等字节的最小移位量,您可以findkeylength。

  3. 按密钥长度移动密文,并对其本身进行XOR。 这将删除密钥,并将与明文异或的明文转移到密钥的长度。 应该有足够的明文来确定消息内容。

阅读更多在encryption问题,第1部分

如果满足以下条件,XORencryption可以合理*强大:

  • 纯文本和密码的长度大致相同。
  • 密码不能用于encryption多个消息。
  • 密码不能被猜测,IE通过字典或其他math手段。 实际上这意味着这些位是随机的。

*具有相当强的意义,它不能被琐碎的math手段打破,就像GeneQ的文章一样。 它仍然没有比你的密码更强。

除了已经提到的几点之外,异或encryption完全容易受到已知明文攻击:

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

其中明文的异或相互抵消,只留下密钥。

对于任何“安全的”encryption方法,其中相同的密钥被用于多于一个明文块(即,一次性的垫仍然是安全的),对于已知明文攻击不容易受到攻击是不够的。

XOR工作方式:

使用多个密钥,每个密钥的长度等于素数,但密钥的长度永远不会相同。 使用原始文件名作为另一个键,但记得要创build一个检索文件名的机制。 然后用扩展名创build一个新的文件名,它会让你知道它是一个encryption文件。 使用多个素数长度的密钥的原因是,它们导致得到的XOR键在重复之前是长度为键A的键B的长度。 在对文件进行encryption之前,从文件中压缩任何重复模式。 生成一个随机数,并XOR这个数字每X偏移(记住,这个数字也必须recounable。你可以使用一个随机种子Filelength。

做完所有这些之后,如果你使用长度为31或更长的5个键,那么最终的密钥长度大约为一百兆!

对于密钥,文件名是一个(包括完整path),STR(文件大小)+ STR(Filedate)+ STR(date)+ STR(时间),随机生成密钥,您的全名,一次创build的私钥。

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

这应该防止图片和音乐等文件的重复模式,但是长度为四个或更长的电影可能仍然是脆弱的,因此可能需要第六个密钥。

我个人有dat文件encryption自己的记忆棒(Dat文件与Microsoft Access一起使用)。 我用一个三键的方法来encryption它,因为它永远不会那么大,作为与相关联的键的文件的目录。

多个密钥而不是随机生成一个非常大的密钥的原因是,素数时间素数会变得很大,并且我可以控制密钥的创build,而且您知道确实没有真正的随机数字这样的东西。 如果我创build了一个大的随机数,其他人可以生成相同的数字。

使用密钥的方法:用一个密钥encryption文件,然后下一个,然后下一个,直到使用所有的密钥。 每个键一遍又一遍地使用,直到整个文件用这个键encryption。

由于密钥的长度不同,重复的重叠对于每个密钥是不同的,因此创build一个导出的密钥长度是密钥一次密钥二。 这个逻辑重复其余的键。 素数的原因是,重复将发生在密钥长度的一个划分上,所以你想要划分为1或密钥的长度,亨氏,素数。

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

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

注意XOR在密码algorithm中使用是很重要的。
这些algorithm在其周围引入math难度。

我只是防止偶然的观众

只要这个假设成立,你的encryptionscheme就可以了。 那些认为Internet Explorer是“互联网”的人不能打破它。

如果没有,只需使用一些encryption库。 对称encryption已经有很多好的algorithm,如Blowfish或者AES。

诺顿的反病毒曾经使用一种技术,使用以前的未encryption信件作为下一个字母的关键。 如果我记得正确的话,那花了我半小时的时间。

如果你只是想阻止那些不经意的观众,这已经足够了。 我用来隐藏可执行文件中的string。 然而,对于任何尝试的人来说,它都不会站起来10分钟。

所有人都说,现在有更好的encryption方法可用,所以为什么不利用自己的更好的东西。 如果你只是试图隐藏“随便”的用户,甚至像gzip这样的工作会更好地完成这项工作。

有点晚回答,但由于没有人提到它,这就是所谓的Vigenère密码。

维基百科提供了一些密码分析攻击来破解它; 更简单一些,因为大多数文件格式都有一个固定的头文件,就是将明文头文件与encryption头文件进行异或运算,为您提供密钥。

另一个诀窍是为您的密码生成一个md5()散列。 通过使用受保护文本的长度作为偏移量,或者将其与您的密码组合,以便为短语提供更好的分布,您可以使其更加独特。 对于长的短语,通过将每个16字节的块与前面的散列结合,演化你的md5()散列 – 使得整个异或键是“随机的”而且是不重复的。

RC4本质上是XORencryption! 与许多stream密码一样 – 关键是密钥(不是双关语!),您必须永远不要重复使用密钥。 EVER!

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

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

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

一旦你对文本进行异或操作,你所剩下的就相当于一个自动密钥密码。 维基百科有一个打破这种密码的好例子

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