What's wrong with XOR encryption?
我写了一个简短的C++程序来对文件进行XOR加密,我可以用它来处理一些个人文件(如果它被破解了,这没什么大不了的——我只是在保护不经意的观众)。基本上,我使用一个ASCII密码,并将文件中的数据重复XOR密码。
现在我很好奇:如果有人想破解这个,他们会怎么做?要花很长时间吗?它是否取决于密码的长度(即,big-o是什么)?
XOR加密的问题是,对于相同字符的长时间运行,很容易看到密码。这样的长时间运行通常是文本文件中的空格。假设您的密码是8个字符,文本文件在某些行中有16个空格(例如,在ASCII图形表的中间)。如果您只是用您的密码XOR,您将看到输出将有重复的字符序列。攻击者只需查找任何此类内容,尝试猜测原始文件中的字符(空格将是第一个尝试的候选字符),并从重复组的长度中派生密码的长度。
二进制文件可能更糟,因为它们通常包含重复的
我同意帕维尔·米纳耶夫对XOR弱点的解释。对于那些感兴趣的人,下面是在几分钟内打破简单XOR加密的标准算法的基本概述:
确定钥匙的长度。这个通过对加密数据执行异或运算来完成它自己移动了各种数字检查有多少个地方字节相同。
如果相等的字节为大于一定百分比(6%来自布鲁斯施耐尔应用密码学第二然后你把以键长的倍数表示的数据。通过找到移动会导致相等字节的数量,您会发现密钥长度。
将密码文本移动keylength和xor。这将删除密钥并离开您纯文本与纯文本移动了关键。应该有足够的明文决定消息内容。
阅读更多有关加密的内容,第1部分
如果满足以下条件,XOR加密可能相当强:
- 纯文本和密码的长度大致相同。
- 密码不能用于加密多封邮件。
- 密码不能被猜出来.实际上,这意味着位是随机的。
*相当强的意思是它不能被琐碎的数学方法打破,如在geneq的文章中。它仍然不比您的密码强。
除了前面提到的点外,XOR加密完全容易受到已知的明文攻击:
1 2 | cryptotext = plaintext XOR key key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext |
在这里,明文互相抵消,只留下钥匙。
对于任何"安全"加密方法来说,不易受到已知的明文攻击是一个必需的但不充分的属性,其中同一密钥用于多个明文块(即一次性PAD仍然是安全的)。
使XOR工作的方法:
使用多个键,每个键的长度等于质数,但键的长度绝不相同。使用原始文件名作为另一个键,但记住要创建一个检索文件名的机制。然后创建一个扩展名为的新文件名,该扩展名将让您知道它是一个加密文件。使用素数长度的多个键的原因是,它们会导致产生的XOR键的长度为键A乘以键B,然后再重复。在对文件进行加密之前,将所有重复模式从文件中压缩出来。生成一个随机数,每X偏移一次XOR这个数(记住,这个数也必须是可重新创建的。您可以使用文件长度的随机种子。
完成所有这些操作后,如果您使用长度为31或更大的5个密钥,您最终将获得大约100兆的密钥长度!
对于密钥,文件名是一个(包括完整路径),str(文件大小)+str(文件日期)+str(日期)+str(时间),随机生成密钥,您的全名,一次创建的私钥。
一种数据库,用于存储用于加密每个文件的密钥,但将数据文件保存在USB记忆棒上,而不是计算机上。
这应该可以防止像图片和音乐这样的文件上的重复模式,但是电影,长度为4个或更多,可能仍然很脆弱,所以可能需要第六个键。
我个人将DAT文件加密在记忆棒上(用于Microsoft Access的DAT文件)。我使用了一个3键方法来加密它,因为它永远不会这么大,它是一个包含相关键的文件目录。
多个键而不是随机生成一个非常大的键的原因是素数乘以素数会很快变大,我对键的创建有一定的控制权,你知道实际上没有真正的随机数。如果我创建了一个大的随机数,其他人就可以生成相同的数。
使用密钥的方法:使用一个密钥加密文件,然后使用下一个密钥,然后使用下一个密钥,直到使用所有密钥。每个密钥被反复使用,直到整个文件被该密钥加密。
因为键的长度不同,所以每个键的重复重叠也不同,因此创建一个派生键,即键的长度为一次键2。对于其余的键,此逻辑重复。质数的原因是,重复会发生在键长度的除法上,因此您希望除法为1或键的长度(母鸡、质数)。
当然,这不仅仅是文件上的一个简单的XOR,但是概念是相同的。
兰斯
I'm just protecting against casual viewers
只要这个假设成立,您的加密方案就可以了。那些认为InternetExplorer是"因特网"的人是无法打破它的。
如果没有,就使用一些加密库。已经有许多很好的对称加密算法,如Blowfish或AES。
另一个技巧是为密码生成一个md5()散列。您可以使用受保护文本的长度作为偏移量,或将其与密码组合,以便为短短语提供更好的分布,从而使其更加独特。对于长短语,通过将每个16字节块与前一个哈希组合起来,使整个XOR键"随机"且不重复,从而发展MD5()哈希。
诺顿的反病毒技术使用了一种使用前一封未加密的信作为下一封信的密钥的技术。如果我记错的话,我花了半个小时才弄清楚。
如果您只想停止临时的查看器,这已经足够好了;我曾经将字符串隐藏在可执行文件中。然而,对于任何一个真正尝试的人来说,它都站不住10分钟。
这就是说,现在有很多更好的加密方法随时可用,所以为什么不利用自己更好的东西呢。如果你只是想躲开"临时"用户,即使是像gzip这样的东西也能做得更好。
好的加密的目标是使没有密钥的解密在数学上变得困难。这包括保护密钥本身的愿望。XOR技术基本上是一个非常简单的密码,如本文所述,很容易被破解。
需要注意的是,XOR用于加密算法中。这些算法致力于引入围绕它的数学难度。
">6%"geneq提到的是英文电报文本的符合索引-26个字母,标点和数字拼写出来。长文本的实际值为0.0665。
<4%是26个字符字母表中随机文本的符合指数,即1/26或0.385。
如果您使用的是不同的语言或字母表,则特定的值会有所不同。如果您使用的是ASCII字符集、Unicode或二进制字节,那么特定的值将非常不同。但是纯文本和随机文本的IC之间通常会存在差异。(压缩后的二进制文件可能有与随机文件非常接近的IC,任何用现代计算机密码加密的文件都将有与随机文本完全相同的IC。)
一旦将文本与自身进行异或,剩下的内容就相当于一个自动密钥密码。维基百科有一个很好的破译密码的例子。
http://en.wikipedia.org/wiki/autokey密码
我回答得有点晚,但由于还没有人提到这一点:这叫做守夜密码。
维基百科提供了许多密码分析攻击来破坏它;更简单的是,由于大多数文件格式都有一个固定的头文件,所以将使用加密头文件对明文头文件进行异或,从而为您提供密钥。
RC4本质上是XOR加密!和许多流密码一样-密钥就是密钥(没有双关语!)切勿重复使用钥匙。永远!