XOR加密有什么问题?

Col*_*lin 52 security encryption xor

我写了一个简短的C++程序来对一个文件进行XOR加密,我可以将它用于一些个人文件(如果它被破解它没什么大不了的 - 我只是在防范偶然的观众).基本上,我使用ASCII密码并使用文件中的数据重复XOR密码.

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

Pav*_*aev 115

XOR加密的问题是,对于相同字符的长时间运行,很容易看到密码.这种长时间运行通常是文本文件中的空格.假设您的密码是8个字符,文本文件在某行中有16个空格(例如,在ASCII图形表的中间).如果您只是使用密码对其进行异或,您将看到输出将具有重复的字符序列.攻击者只会查找任何此类内容,尝试猜测原始文件中的字符(空格将是第一个尝试的候选者),并从重复组的长度中获取密码的长度.

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

  • 当你的"密钥"小于明文时,你应该清楚你正在谈论一个XOR方案.如果密钥与明文大小相同,并且"真正"随机(至少来自攻击者的POV)则为OTP; 又名牢不可破. (38认同)
  • 请注意,对具有空格字符的整个文件进行异或操作几乎是微不足道的,此时任何合理的字符串都会作为可能的密码跳出来.对于使用ASCII字符串进行异或的二进制文件,结果*中的任何字符串都是*密码.shell提示符下的strings命令会找到它们. (11认同)
  • 见上面的评论.是的,如果您有一次性垫(长度相同,并且加密质量随机),那么XOR非常好. (3认同)

Gen*_*neQ 67

我同意Pavel Minaev 对XOR弱点解释.对于那些感兴趣的人,这里是用于在几分钟内打破琐碎的XOR加密的标准算法的基本概述:

  1. 确定密钥的长度.这是通过对加密数据进行异或运算来实现的,该数据本身移动了不同数量的位置,并检查了多少字节是相同的.

  2. 如果相等的字节大于某个百分比(根据Bruce Schneier的Applied Cryptography第二版的 6%),那么您已将数据移动了密钥长度的倍数. 通过找到导致大量相等字节的最小移位量,您可以找到密钥长度.

  3. 按键长移动密文,并对其自身进行异或. 这将删除密钥,并使用明文进行异或,并使用明文移动密钥的长度.应该有足够的明文来确定消息内容.

有关详细信息,请参阅加密事项,第1部分

  • 请注意,截至 2020 年 2 月 7 日,似乎 [http://www.kuro5hin.org/?op=displaystory&sid=2000/4/10/174741/423](http://www.kuro5hin.org /?op=displaystory&sid=2000/4/10/174741/423) URL 不再可用 — 该域名似乎正在出售。不过,您可以在 [加密问题,第 1 部分](https://web.archive.org/web/20141110172938/http://www.kuro5hin.org/) 上找到有关 WayBack Machine(互联网档案馆)的原始文章?op=displaystory&sid=2000/4/10/174741/423)。 (2认同)

Sin*_*ion 22

如果满足以下条件,则XOR加密可以合理地强*:

  • 纯文本和密码长度大致相同.
  • 密码不会重复用于加密多条消息.
  • 密码不能被猜测,IE可以通过字典或其他数学方式.实际上,这意味着比特是随机的.

*合理强大意味着它无法通过琐碎的数学手段打破,如GeneQ的帖子.它仍然没有你的密码强.

  • 这将是一次性的:http://en.wikipedia.org/wiki/One-time_pad (22认同)
  • *"合理安全"* - 任何时候都不能打破一次打击垫(假设打击垫是完全随机的).它们是*唯一*绝对安全的加密方法. (9认同)
  • 对于一次性填充,密钥必须与明文的长度相同.如果这是真的,并且密钥永远不会被重用,那么一次性密钥绝对安全.如果您对密码学的历史感兴趣,我强烈推荐David Kahn编写的The Codebreakers:http://www.amazon.ca/Codebreakers-Comprehensive-History-Communication-Internet/dp/0684831309 (6认同)
  • 一次性垫不是绝对安全的; 它只与在加密端和解密端之间共享填充的方法一样安全. (4认同)

laa*_*lto 12

除了已经提到的要点之外,XOR加密完全容易受到已知明文攻击:

cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext
Run Code Online (Sandbox Code Playgroud)

XORring明文互相取消,只留下钥匙.

不易受已知明文攻击的影响是任何"安全"加密方法的必需但不充分的属性,其中相同的密钥用于多于一个的明文块(即,一次性密钥仍然是安全的).

  • +1值得一提的是,即使文件的一小部分是已知的(例如大多数文件格式使用的标题),也可以轻松获得密钥并解密整个文件. (7认同)

小智 6

如何使XOR工作:

使用多个密钥,每个密钥长度等于素数,但密钥的长度从不相同.使用原始文件名作为另一个键,但记住创建一个检索文件名的机制.然后创建一个带有扩展名的新文件名,让您知道它是加密文件.使用素数长度的多个密钥的原因是它们在重复之前导致所得到的XOR密钥长度为密钥A TIMES密钥B. 在加密之前压缩文件中的任何重复模式.每X偏移生成一个随机数并对此数字进行异或(请记住,此数字也必须是可重新计算的.您可以使用Filelength的随机种子.

完成所有这些操作后,如果您使用长度为31或更大的5个键,您最终的键长约为一百兆!

对于密钥,文件名为1(包括完整路径),STR(文件大小)+ STR(Filedate)+ STR(日期)+ STR(时间),随机生成密钥,您的全名,一次创建私钥.

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

这应该可以防止像图片和音乐这样的文件上出现重复模式,但是长度为4或者以上的电影可能仍然容易受到攻击,因此可能需要第六个密钥.

我个人在记忆棒(用于Microsoft Access的Dat文件)上加密了自己的dat文件.我使用3键方法对其进行加密,因为它永远不会那么大,是具有相关键的文件的目录.

多个键而不是随机生成一个非常大的键的原因是素数时间素数变得很快并且我对键的创建有一些控制权并且你知道真的没有真正的随机数这样的东西.如果我创建了一个大的随机数,则其他人可以生成相同的数字.

使用密钥的方法:用一个密钥加密文件,然后用下一个密钥加密,然后用下一个密钥加密.每个密钥都反复使用,直到用该密钥加密整个文件.

因为密钥的长度不同,所以每个密钥的重复重叠是不同的,因此创建一个导出密钥,密钥一次密钥二的长度.这个逻辑重复其余的键.素数的原因是重复会发生在键长的一个除法上,所以你希望除法为1或键的长度,hense,prime.

好的,被授予,这不仅仅是文件上的简单XOR,但概念是相同的.

长矛


Joh*_*ith 5

我只是在防止不经意的观众

只要这个假设成立,你的加密方案就可以了。认为 Internet Explorer 是“互联网”的人无法破解它。

如果没有,只需使用一些加密库。已经有很多很好的算法,比如用于对称加密的 Blowfish 或 AES。