谦虚好学的路灯 · Windows系统缺少twinapi.app ...· 19 小时前 · |
礼貌的皮带 · python--循环绘制ERA5风场的空间分 ...· 3 月前 · |
鬼畜的登山鞋 · 【环境配置/软件安装】win10配置mmde ...· 1 年前 · |
活泼的高山 · Python:模块和包模块和包_python ...· 1 年前 · |
我写了一个简短的C++程序来对文件进行异或加密,我可能会用它来加密一些个人文件(如果它被破解了,也没什么大不了的--我只是为了防止不经意的人浏览)。基本上,我接受一个ASCII密码,并重复将密码与文件中的数据进行异或运算。
不过,现在我很好奇:如果有人想破解这个问题,他们会怎么做?需要很长时间吗?它依赖于密码的长度吗(例如,大O是多少)?
XOR加密的问题是,对于相同字符的长时间运行,很容易看到密码。这样的长游程通常是文本文件中的空格。假设您的密码是8个字符,文本文件的某一行有16个空格(例如,在ASCII-graphics表的中间)。如果您只是将其与您的密码进行XOR运算,您将看到输出将具有重复的字符序列。攻击者只需查找任何这样的内容,尝试猜测原始文件中的字符(空格将是第一个尝试的候选字符),并从重复组的长度推导出密码的长度。
二进制文件可能更糟,因为它们通常包含重复的
0x00
字节序列。显然,带有这些参数的XORing是no-op,所以您的密码将以纯文本形式显示在输出中!具有长序列空的非常常见的二进制格式的一个例子是
.doc
。
诺顿的反病毒软件过去使用一种技术,使用前一个未加密的字母作为下一个字母的密钥。如果我没记错的话,我多花了半个小时才弄清楚。
如果您只是想停止随意的查看器,这已经足够好了;我曾经将字符串隐藏在可执行文件中。然而,对于任何真正尝试的人来说,它都不会站10分钟。
尽管如此,现在已经有了更好的加密方法,所以为什么不利用一些更好的方法呢?如果你只是想对“临时”用户隐藏起来,即使是像gzip这样的工具也能更好地做到这一点。
除了已经提到的几点之外,XOR加密完全容易受到已知明文攻击:
cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext
在XORring中,明文相互抵消,只留下密钥。
不容易受到已知明文攻击是任何“安全”加密方法的必需但不充分的特性,其中相同的密钥用于一个以上的明文块(即,一次性填充仍然是安全的)。
RC4本质上是异或加密!与许多流密码一样,密钥就是密钥(没有双关语的意思!)您永远不能重用该密钥。永远不会!
GeneQ提到的">6%“是英语电报文本的符合度指数- 26个字母,并拼写出标点符号和数字。长文本的实际值是0.0665。
<4%是26个字符的字母表中随机文本的重合度指数,为1/26,即0.385。
如果您使用的是不同的语言或不同的字母表,则特定值将会不同。如果使用ASCII字符集、Unicode或二进制字节,则特定值将非常不同。但是明文和随机文本之间的IC通常是不同的。(压缩二进制文件的IC可能非常接近随机文件的IC,用任何现代计算机密码加密的任何文件都具有与随机文本完全相同的IC。)
一旦你对文本本身执行了XORed操作,剩下的就相当于一个自动密钥密码。维基百科就是破解这种密码的一个很好的例子。
另一个技巧是为您的密码生成一个md5()散列。您可以使用受保护文本的长度作为偏移量,或将其与您的密码相结合,以更好地分发简短短语,从而使其更加独特。对于长短语,通过将每个16字节块与前一个散列组合在一起来演变您的md5()散列--使整个异或键“随机”且不重复。
使用XOR的方法:
使用多个密钥,每个密钥长度等于一个质数,但不能与密钥长度相同。使用原始文件名作为另一个键,但请记住创建一个检索文件名的机制。然后创建一个带有扩展名的新文件名,让您知道它是一个加密文件。使用多个素数长度的密钥的原因是,它们导致生成的XOR密钥在重复之前是密钥A乘以密钥B的长度。在加密文件之前,压缩文件中的任何重复模式。生成一个随机数,并对此数进行XOR运算(请记住,此数也必须是可重新创建的。您可以使用Filelength的随机种子。
完成所有这些操作后,如果您使用长度为31或更长的5个密钥,则最终的密钥长度约为100兆!
对于密钥,Filename是1(包括完整路径)、STR(文件大小)+STR(文件日期)+STR(日期)+STR(时间)、随机生成密钥、您的全名、一次性创建的私钥。
一个数据库,用于存储用于每个加密文件的密钥,但将DAT文件保存在USB记忆棒上,而不是计算机上。
这应该会防止重复模式的文件,如图片和音乐,但电影,是四个或更长的,可能仍然是脆弱的,所以可能需要第六个密钥。
我个人已经在记忆棒上加密了dat文件(用于Microsoft Access的Dat文件)。我使用了3-Key的方法来加密它,因为它永远不会那么大,因为它是一个包含相关密钥的文件的目录。
使用多个密钥而不是随机生成一个非常大的密钥的原因是,素数乘以素数很快就会变大,我可以控制密钥的创建,你知道真正的随机数是不存在的。如果我创建了一个很大的随机数,其他人也可以生成相同的数。
使用密钥的方法:使用一个密钥加密文件,然后是下一个,然后是下一个,直到使用完所有密钥。重复使用每个密钥,直到使用该密钥加密整个文件。
因为密钥具有不同的长度,所以对于每个密钥,重复的重叠是不同的,因此创建了密钥长度为密钥一乘以密钥二的派生密钥。此逻辑对其余的键重复执行。素数的原因是,重复会发生在密钥长度的除法上,所以您希望除法是1或密钥的长度,hense,质数。
好吧,当然,这不仅仅是对文件进行简单的XOR运算,但概念是相同的。
兰斯
如果您想继续使用XOR,您可以很容易地将密码与多个不同的盐(在散列之前添加到密码中的字符串)进行散列,然后将它们组合以获得更大的密钥。例如,使用sha3-512和64个唯一的盐,然后将你的密码与每个盐进行哈希运算,得到一个32768位的密钥,你可以用它来加密32Kib (Kilibit) (4KiB (kilibyte))或更小的文件。在现代CPU上,这样多次散列应该不到一秒。为了更安全,你可以尝试在加密过程中操作你的密钥,比如AES (Rijndael)。AES实际上使用切换表对密钥进行XOR运算,并在每次重复密钥时修改密钥。它已经成为了一个国际标准,所以它非常安全。
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券