使用Fortuna PRNG的AES计数器模式随机访问加密:

5
我正在构建基于AES的文件加密系统,需要能够在随机访问模式下工作(访问文件的任何部分)。例如,可以使用Counter模式的AES,但众所周知我们需要一个从未重复使用过的唯一序列。在这种情况下,使用简化版Fortuna PRNG是否可行(用特定于特定文件的随机选择的唯一密钥对计数器进行加密)?这种方法存在弱点吗?
因此,加密/解密可能如下所示:
偏移量处块的加密:
rndsubseq = AESEnc(Offset, FileUniqueKey)
xoredplaintext = plaintext xor rndsubseq
ciphertext = AESEnc(xoredplaintext, PasswordBasedKey)

在偏移量处解密一个块:

rndsubseq = AESEnc(Offset, FileUniqueKey)
xoredplaintext = AESDec(ciphertext, PasswordBasedKey)
plaintext = xoredplaintext xor rndsubseq

有一个观察。我自己想出了Fortuna中使用的想法,后来发现它已经被发明了。但是随处可见的关键点是安全性,但还有另一个好处:它是一个非常好的伪随机数生成器(以简化形式说)。因此,该PRNG不仅可以产生非常好的序列(我用Ent和Die Hard测试过),而且还允许在知道步骤编号的情况下访问任何子序列。因此,在安全应用程序中将Fortuna用作“随机访问”PRNG是否一般可以接受?

编辑:

换句话说,我的建议是使用Fortuna PRNG作为微调以形成具有随机访问能力的可微调AES密码。我读过Liskov,Rivest和Wagner的论文,但无法理解密码器在操作模式和可微调密码器之间的主要区别。他们说他们建议从高层内部将这种方法带到密码本身中,但例如在我的情况下,明文与微调异或,这是微调还是不是微调?

2个回答

5
我认为您可能想了解“可调整的分组密码”的工作原理,并查看磁盘加密问题的解决方法:磁盘加密理论。整个磁盘的加密类似于您的问题:必须独立加密每个扇区(您希望在不同偏移处独立加密数据),但整个过程必须安全。已经有很多相关研究。维基百科似乎提供了很好的概述。
编辑后添加: 关于您的编辑:是的,您正在尝试通过将调整值与明文进行异或来制作可调整块密码。更具体地说,您有Enc(T,K,M) = AES(K, f(T) xor M),其中AES(K,...)表示使用密钥K进行AES加密,f(T)是调整值的某个函数(在您的情况下,我想它是Fortuna)。我简要查看了您提到的论文,据我所知,可以证明这种方法不会产生安全的可调整块密码。 基于Liskov、Rivest、Wagner论文第2节中的定义,思路如下。我们可以访问加密oracle或随机置换,并且我们想知道我们正在与哪一个交互。我们可以设置调整值T和明文M,然后得到相应的密文,但我们不知道使用的密钥。以下是如何确定我们是否使用构造AES(K, f(T) xor M)。 选择任意两个不同的值T、T',计算f(T)、f(T')。选择任何消息M,然后将第二个消息计算为M' = M xor f(T) xor f(T')。现在请加密oracle使用调整值T加密M,使用调整值T'加密M'。如果我们处理考虑的构造,输出将是相同的。如果我们处理随机置换,输出几乎肯定是不同的(概率为1-2^-128)。这是因为AES加密的两个输入都相同,所以密文也相同。当我们使用随机置换时,情况并非如此,因为两个输出相同的概率为2^-128。底线是将调整值异或到输入中可能不是一种安全的方法。

这篇论文给出了一些安全构造的例子。其中最简单的一个似乎是Enc(T,K,M) = AES(K, T xor AES(K, M))。每个块需要两次加密,但是这种构造的安全性已经被证明。他们还提到了更快的变体,但是它们需要额外的原语(几乎异或通用函数族)。


虽然我已经阅读了关于磁盘加密理论的文章,但在这里提及它还是很好的(+1)。我刚刚阅读了有关可调整块密码的文档,并将编辑帖子。 - Maksee

1

虽然我认为你的方法足够安全,但我没有看到与CTR相比的任何好处。你遇到了完全相同的问题,即在密文中没有注入真正的随机性。偏移量是一个已知的系统输入。尽管它使用了一个密钥进行加密,但它仍然不是随机的。

另一个问题是如何保护FileUniqueKey的安全性?用密码加密吗?当你使用多个密钥时会引入一系列问题。

计数器模式是加密随机访问文件的常见实践。尽管它存在各种漏洞,但经过深入研究,风险是可衡量的。


我尝试避免在CTR中使用简单计数器,以解决使用相同密码加密的不同文件具有相同偏移量的相同密码块的出现。因此,我只需要一些独特的序列用于AES CTR。当然,可以为每个文件设置唯一的Guid并且每个下一个块+16,但是在相同的Guid上使用PRNG会使得从一个块到另一个块数据更加显著的变化。似乎即使保持FileKey秘密也不是必要的。也许我错了,但我很感兴趣如果我保证每个文件的序列的唯一性,那么可能存在哪种信息泄漏。 - Maksee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接