我写了一个简短的C ++程序来对一个文件进行XOR加密,我可以将它用于某些个人文件(如果它被破解它没什么大不了的 - 我只是在防范偶然的观众)。基本上,我使用ASCII密码并使用文件中的数据重复XOR密码。
现在我很好奇:如果有人想破解这个问题,他们会怎么做呢?需要很长时间吗?它取决于密码的长度(即,什么是大O)?
答案 0 :(得分:114)
XOR加密的问题在于,对于相同字符的长时间运行,很容易看到密码。这种长时间运行通常是文本文件中的空格。假设您的密码是8个字符,文本文件在某行中有16个空格(例如,在ASCII图形表的中间)。如果您只是使用密码对其进行异或,您将看到输出将具有重复的字符序列。攻击者只会查找任何此类内容,尝试猜测原始文件中的字符(空格将是第一个尝试的候选者),并从重复组的长度中获取密码的长度。
二进制文件可能更糟糕,因为它们通常包含0x00
个字节的重复序列。显然,与那些XORing是无操作的,所以你的密码将在输出中以纯文本显示!具有长序列空值的非常常见的二进制格式的示例是.doc
。
答案 1 :(得分:67)
我赞同XOR弱点的Pavel Minaev's explanation。对于那些感兴趣的人,这里是用于在几分钟内打破琐碎的XOR加密的标准算法的基本概述:
确定密钥的持续时间。 此 通过对加密数据进行异或来完成 本身改变了各种数字 的地方,并检查了多少 字节是相同的。
如果相等的字节是 超过一定比例 (6%符合布鲁斯施奈尔的 应用密码学第二 版本),然后你已经改变了 数据是密钥长度的倍数。 找到最小量的 转移导致一个大的 等量的字节,你找到了 keylength。
按密码移动密文 keylength和XOR对抗自身。 这将删除密钥并离开您 与明文XORed与 明文改变了长度 关键。应该足够了 明文确定消息 内容。
答案 2 :(得分:22)
如果满足以下条件,XOR加密可以合理地强*:
*合理强大意味着它无法通过琐碎的数学手段打破,如GeneQ的帖子。它仍然没有你的密码强。
答案 3 :(得分:12)
除了已经提到的要点之外,XOR加密完全容易受到已知明文攻击的影响:
cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext
在那里,对明文进行异或取消,只留下钥匙。
不易受已知明文攻击的影响是任何“安全”加密方法的必需但不充分的属性,其中相同的密钥用于多个明文块(即一次性密钥仍然是安全的)。 / p>
答案 4 :(得分:6)
使XOR工作的方法:
使用多个键,每个键长度等于素数,但键的长度从不相同。 使用原始文件名作为另一个键,但记住创建一个检索文件名的机制。然后创建一个带有扩展名的新文件名,让您知道它是加密文件。 使用素数长度的多个密钥的原因是它们在重复之前导致所得到的XOR密钥长度为密钥A TIMES密钥B. 在加密之前压缩文件中的任何重复模式。 每X偏移产生一个随机数和XOR这个数字(请记住,这个数字也必须是可重新训练的。你可以使用Filelength的RANDOM SEED。
完成所有这些操作后,如果您使用长度为31或更大的5个键,您最终的密钥长度大约为一百兆!
对于密钥,文件名为1(包括完整路径),STR(文件大小)+ STR(Filedate)+ STR(日期)+ STR(时间),随机生成密钥,您的全名,一次创建的私钥
用于存储用于加密的每个文件的密钥的数据库,但是将DAT文件保存在USB记忆棒上而不是计算机上。
这可以防止图片和音乐等文件上出现重复图案,但电影的长度为4或更长,可能仍然容易受到攻击,因此可能需要第六个密钥。
我个人在记忆棒(用于Microsoft Access的Dat文件)上加密了自己的dat文件。我使用了3-Key方法来加密它,因为它永远不会那么大,是具有相关键的文件的目录。
多个键而不是随机生成一个非常大的键的原因是素数时间素数变得很快并且我对键的创建有一些控制权并且你知道真的没有真正的随机数这样的东西。如果我创建了一个大的随机数,则其他人可以生成相同的数字。
使用密钥的方法:使用一个密钥加密文件,然后使用下一个密钥,然后使用下一个密钥,直到使用所有密钥。每个密钥都反复使用,直到用该密钥加密整个文件。
因为键的长度不同,所以每个键的重复重叠是不同的,因此创建一个派生键,键一次键的长度为2。这个逻辑重复其余的键。素数的原因是重复会发生在键长的一个除法上,所以你希望除法为1或键的长度,hense,prime。
好的,授予,这不仅仅是文件上的简单XOR,但概念是相同的。
兰斯
答案 5 :(得分:3)
我只是在防范偶然的观众
只要这个假设成立,你的加密方案就可以了。认为Internet Explorer是“互联网”的人无法打破它。
如果没有,只需使用一些加密库。对于密集加密,已经有许多优秀的算法,如Blowfish或AES。
答案 6 :(得分:2)
good encryption的目标是在没有密钥的情况下使数学难以解密。
这包括保护钥匙本身的愿望
XOR technique基本上是一个非常简单的密码,如此处所述。
重要的是要注意在cryptographic algorithms内使用XOR 这些算法围绕它引入数学难题。
答案 7 :(得分:2)
Norton的反病毒过去常常使用以前未加密的字母作为下一个字母的关键字。如果我没记错的话,这花了我额外的半小时来弄清楚。
如果你只想阻止随意的观众,这就足够了;我曾经在可执行文件中隐藏字符串。然而,对于任何真正尝试的人来说,它都不会站立10分钟。
所有人都说,现在有更好的加密方法可供使用,所以为什么不利用更好的东西。如果你试图躲避“随意”用户,即使像gzip这样的东西也可以做得更好。
答案 8 :(得分:2)
另一个技巧是为您的密码生成md5()哈希。您可以将受保护文本的长度用作偏移量或将其与密码相结合,以便为短语提供更好的分布,从而使其更加独特。对于长短语,通过将每个16字节块与前一个散列相结合来演化md5()散列 - 使整个XOR键“随机”且不重复。
答案 9 :(得分:1)
RC4基本上是XOR加密!和许多流密码一样 - 关键是密钥(没有双关语!),你必须永远不要重用密钥。 EVER!
答案 10 :(得分:1)
我很少回答 ,但由于还没有人提及它:这被称为Vigenère密码。
维基百科提供了许多cryptanalysis attacks来打破它;但是,更简单的是,由于大多数文件格式都有固定的标题,因此可以使用加密标题对明文标题进行异或,为您提供密钥。
答案 11 :(得分:1)
GeneQ提到的“> 6%”是英文电报文本的巧合指数 - 26个字母,标点符号和数字拼写出来。长文本的实际值为0.0665。
< 4%是26个字母的随机文本的重合指数,即1/26或0.385。
如果您使用的是其他语言或不同的字母,则具体值会有所不同。如果您使用ASCII字符集,Unicode或二进制字节,则特定值将非常不同。但是明文IC和随机文本之间的区别通常会存在。 (压缩二进制文件可能具有非常接近随机IC的IC,并且使用任何现代计算机密码加密的任何文件都将具有与随机文本完全相同的IC。)
一旦你对自己的文本进行了异或,你剩下的就相当于一个自动密钥密码。维基百科有一个打破这种密码的好例子
答案 12 :(得分:0)
如果您想继续使用XOR,则可以轻松地用多种不同的盐(在哈希之前添加到密码中的字符串)对密码进行哈希处理,然后将它们组合起来以获得更大的密钥。 例如。将sha3-512与64个唯一的盐一起使用,然后对每个盐进行哈希加密以获得32768位密钥,您可以使用该密钥对32Kib(Kilibit)(4KiB(kilibyte))或更小的文件进行加密。在现代CPU上,多次散列应该少于一秒钟。 为了获得更安全的保护,您可以尝试在加密(例如AES(Rijndael))期间操纵密钥。 AES实际上执行XOR运算,并使用切换表对密钥的每次重复进行修改。它成为国际标准,因此非常安全。