我写了一个简短的 C++ 程序来对一个文件进行 XOR 加密,我可以将它用于一些个人文件(如果它被破解也没什么大不了的——我只是为了防止偶然的观众)。基本上,我使用 ASCII 密码,并反复将密码与文件中的数据进行异或。
不过,现在我很好奇:如果有人想破解这个,他们会怎么做?会不会需要很长时间?它是否取决于密码的长度(即,什么是大 O)?
我写了一个简短的 C++ 程序来对一个文件进行 XOR 加密,我可以将它用于一些个人文件(如果它被破解也没什么大不了的——我只是为了防止偶然的观众)。基本上,我使用 ASCII 密码,并反复将密码与文件中的数据进行异或。
不过,现在我很好奇:如果有人想破解这个,他们会怎么做?会不会需要很长时间?它是否取决于密码的长度(即,什么是大 O)?
XOR 加密的问题在于,对于相同字符的长时间运行,很容易看到密码。如此长的运行最常见的是文本文件中的空格。假设您的密码是 8 个字符,并且文本文件的某行中有 16 个空格(例如,在 ASCII 图形表的中间)。如果你只是用你的密码异或,你会看到输出将有重复的字符序列。攻击者只会寻找任何此类,尝试猜测原始文件中的字符(空格将是第一个尝试的候选者),并从重复组的长度中推导出密码的长度。
二进制文件可能更糟,因为它们通常包含重复的0x00
字节序列。显然,与这些进行异或运算是无操作的,因此您的密码将在输出中以纯文本形式显示!具有长空序列的非常常见的二进制格式的示例是.doc
.
我同意Pavel Minaev 对 XOR 弱点的 解释。对于那些感兴趣的人,这里是用于在几分钟内破解普通 XOR 加密的标准算法的基本概述:
确定密钥的长度。这是通过将加密数据与自身移位不同数量的位置进行异或运算来完成的,并检查有多少字节是相同的。
如果相等的字节大于某个百分比(根据Bruce Schneier 的 Applied Cryptography 第二版,为 6% ),那么您已经将数据移动了密钥长度的倍数。 通过找到导致大量相等字节的最小移位量,您可以找到密钥长度。
按密钥长度移动密文,并对其自身进行异或。 这将删除密钥并为您留下明文 XORed,明文移动了密钥的长度。应该有足够的明文来确定消息内容。
阅读更多加密事项,第 1 部分
如果满足以下条件,XOR 加密可以相当*强:
*合理的强意味着它不能被微不足道的数学方法破坏,如 GeneQ 的帖子。它仍然不比您的密码强。
除了已经提到的几点,XOR 加密完全容易受到已知明文攻击:
cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext
其中 XORring 明文相互抵消,只留下密钥。
对于任何“安全”加密方法而言,不易受到已知明文攻击的攻击是必需的,但还不够充分,其中相同的密钥用于多个明文块(即一次性密码仍然是安全的)。
使 XOR 工作的方法:
使用多个密钥,每个密钥长度等于一个质数,但密钥长度永远不会相同。使用原始文件名作为另一个键,但请记住创建检索文件名的机制。然后创建一个带有扩展名的新文件名,让您知道它是一个加密文件。使用多个素数长度的密钥的原因是它们导致生成的 XOR 密钥在重复之前的长度是密钥 A 乘以密钥 B。在加密之前压缩文件中的任何重复模式。生成一个随机数并在每个 X 偏移量 XOR 这个数字(请记住,这个数字也必须是可重新创建的。您可以使用 Filelength 的 RANDOM SEED。
完成所有这些操作后,如果您使用 5 个长度为 31 或更大的密钥,您最终将获得大约 100 兆的密钥长度!
对于密钥,文件名是一个(包括完整路径),STR(文件大小)+ STR(文件日期)+ STR(日期)+ STR(时间),随机生成密钥,您的全名,一次创建的私钥。
一个数据库,用于存储用于每个加密文件的密钥,但将 DAT 文件保存在 USB 记忆棒上而不是计算机上。
这应该可以防止像图片和音乐这样的文件出现重复模式,但是长度为四场或更多的电影可能仍然容易受到攻击,因此可能需要第六个密钥。
我个人在记忆棒上加密了 dat 文件(用于 Microsoft Access 的 Dat 文件)。我使用 3-Key 方法对其进行加密,因为它永远不会那么大,它是具有关联密钥的文件的目录。
使用多个密钥而不是随机生成一个非常大的密钥的原因是素数乘以素数很快就会变大,而且我对密钥的创建有一些控制,你知道确实没有真正的随机数这样的东西。如果我创建了一个大随机数,其他人可以生成相同的数字。
使用密钥的方法:用一个密钥加密文件,然后用下一个,然后再下一个,直到所有密钥都用完。每个密钥都被一遍又一遍地使用,直到整个文件都被该密钥加密。
由于密钥的长度不同,重复的重叠对于每个密钥都是不同的,因此创建了一个派生密钥,其长度为密钥一次密钥二的长度。其余键重复此逻辑。素数的原因是重复会发生在密钥长度的除法上,因此您希望除法为 1 或密钥的长度,即质数。
好的,当然,这不仅仅是对文件的简单异或,但概念是相同的。
槊
我只是在防止普通观众
只要这个假设成立,你的加密方案就可以了。认为 Internet Explorer 是“互联网”的人无法打破它。
如果没有,只需使用一些加密库。已经有很多很好的算法,如 Blowfish 或 AES 用于对称加密。
诺顿的反病毒软件曾经使用一种技术,使用前一个未加密的字母作为下一个字母的密钥。如果我没记错的话,我花了半个小时才弄清楚。
如果您只是想阻止普通观众,那就足够了;我曾经在可执行文件中隐藏字符串。然而,对于任何真正尝试过的人来说,它不会站起来 10 分钟。
总而言之,现在有很多更好的加密方法可供使用,所以为什么不利用更好的东西呢。如果您只是想对“休闲”用户隐藏,那么即使 gzip 之类的东西也会做得更好。
另一个技巧是为您的密码生成一个 md5() 哈希。您可以通过使用受保护文本的长度作为偏移量或将其与您的密码相结合以更好地分配短短语,从而使其更加独特。对于长短语,通过将每个 16 字节块与前一个哈希组合来改进您的 md5() 哈希 - 使整个 XOR 密钥“随机”且不重复。
RC4 本质上是 XOR 加密!与许多流密码一样 - 密钥就是密钥(没有双关语!)您绝不能重复使用密钥。曾经!
我回答得有点晚了,但因为还没有人提到它:这被称为 Vigenère 密码。
维基百科提供了许多密码分析攻击来破解它;不过,更简单的是,由于大多数文件格式都有固定的标头,因此将明文标头与加密标头进行异或运算,从而为您提供密钥。
GeneQ 提到的“>6%”是英文电报文本的巧合指数——26 个字母,标点符号和数字都拼出来。长文本的实际值为 0.0665。
<4% 是 26 个字符字母表中随机文本的重合指数,即 1/26 或 0.385。
如果您使用不同的语言或不同的字母表,则具体值会有所不同。如果您使用 ASCII 字符集、Unicode 或二进制字节,则具体值将大不相同。但是明文IC和随机文本IC之间通常会存在差异。(压缩的二进制文件可能具有非常接近随机的 IC,任何使用任何现代计算机密码加密的文件都将具有与随机文本完全相同的 IC。)
一旦你对文本进行了异或运算,你剩下的就相当于一个自动密钥密码。维基百科有一个破解这种密码的好例子
如果您想继续使用 XOR,您可以轻松地使用多个不同的盐(在哈希之前添加到密码中的字符串)对密码进行哈希处理,然后将它们组合以获得更大的密钥。EG 使用带有 64 个唯一盐的 sha3-512,然后使用每个盐对您的密码进行哈希处理,以获得一个 32768 位密钥,您可以使用它来加密 32Kib (Kilibit) (4KiB (kilibyte)) 或更小的文件。在现代 CPU 上,多次散列应该不到一秒。为了更安全,您可以尝试在 AES (Rijndael) 等加密期间操作您的密钥。AES 实际上执行 XOR 时间,并使用开关表在每次重复密钥时修改密钥。它已成为国际标准,因此非常安全。