使用密钥重用进行安全加密数据存储
用于数据存储的增强加密算法(
引言
许多单文件加密算法使用简单的流密码。这些密码将要加密的文件中的字节与伪随机数生成器 (PRNG) 的一系列输出进行异或 (XOR) 操作。如果用户使用相同的密钥两次加密同一个文件,将生成完全相同的加密输出。
如果密码分析师认为用户使用了相同的密钥来加密两个不同的文件,他可以将这两个文件进行异或操作,从而抵消 PRNG 的输出。这使得密码分析师得到一个文件,其中仅包含两个原始文件相互异或的结果。在这种情况下,猜测原始内容变得容易得多。
此外,密码分析师可以使用明文攻击。在这些攻击中,如果密码分析师知道文件类型,那么他可以利用对文件头格式的了解来猜测用于编码文件的密钥流。
这里的算法使用以高熵源为种子值的 PRNG,在文件的开头插入一个数据块。此数据是首先被加密的数据。在解密时,第一个数据块将被丢弃,从而恢复原始文件。由于该算法的设计使得单个比特的变化会在整个文件中产生雪崩效应,因此引入的这个初始数据块使得即使使用相同的密钥,每次加密相同的文件也会产生不同的加密结果。
背景
在 Bruce Schneier 的《应用密码学》一书中,他提到了一种分组密码,其中每个分组都与前一个分组的密文与密钥的哈希值进行异或操作。
对此主题的一个简单变体是将第一个块与密钥的哈希值进行异或操作,并将后续块与前一个块的明文以及前一个块使用的哈希值进行异或操作。
由于起始哈希是由密钥生成的,因此密钥仍然会在整个密文中产生雪崩效应,因为每个哈希值都用于生成下一个块的哈希值。
Using the Code
附带的源代码是为演示上述原理而开发的。它使用 Visual C++ 作为控制台应用程序开发。所有代码都在一个文件中;虽然不太美观,但它能正常工作。
关注点
在我的 3GHz 双核奔腾处理器上,该代码的加密和解密速度为 8MB/s。
历史
- 2008 年 7 月 22 日:初始发布