security - 使用Fortuna PRNG :在计数器模式下使用AES进行随机访问加密

标签 security encryption prng

我正在基于AES构建文件加密,必须能够在随机访问模式下工作(访问文件的任何部分)。例如,可以使用Counter中的AES,但众所周知,我们需要一个从未使用过两次的唯一序列。
在这种情况下,可以使用简化的Fortuna PRNG(使用针对特定文件的随机选择的唯一 key 对计数器进行加密)吗?这种方法是否有弱点?

所以加密/解密看起来像这样

偏移处的块加密:

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的著作,但无法理解工作模式中的密码与可调整的密码之间的主要区别是什么。他们说,他们建议将这种方法从密码本身的更高层次引入,但是例如,在我的情况下,通过调整对纯文本进行异或,这是否是调整?

最佳答案

我认为您可能想查看“可调整的分组密码”的工作原理,并看看如何解决光盘加密问题:Disk encryption theory。加密整个磁盘与您的问题类似:每个扇区的加密必须独立进行(您希望以不同的偏移量对数据进行独立加密),但是整个过程必须是安全的。在这方面有很多工作要做。维基百科似乎提供了很好的概述。

编辑添加:
重新编辑:是的,您正在尝试通过对明文与明文进行XOR来从AES中做出明文。更具体地说,您具有Enc(T,K,M)= AES(K,f(T)xor M),其中AES(K,...)表示使用 key K进行AES加密,而f(T)是调整(在您的情况下,我猜是Fortuna)。我简要介绍了您提到的论文,据我所知,有可能表明该方法不会产生安全的可调整分组密码。
这个想法(基于Liskov,Rivest,Wagner论文第2节的定义)如下。我们可以访问加密oracle或随机排列,我们想告诉我们正在与哪个交互。我们可以设置调整T和明文M,然后获取相应的密文,但我们不知道所使用的 key 。这是如何确定我们是否使用构造AES(K,f(T)xor M)的方法。
选择任意两个不同的值T,T',计算f(T),f(T')。选择任意一条消息M,然后计算第二条消息为M'= M xor f(T)xor f(T')。现在,要求加密预言家使用调整T加密M,并使用调整T'加密M'。如果我们考虑考虑的结构,输出将是相同的。如果我们处理随机排列,则输出几乎可以肯定(概率为1-2 ^ -128)是不同的。那是因为AES加密的两个输入将是相同的,因此密文也将是相同的。当我们使用随机置换时,情况并非如此,因为两个输出相同的概率为2 ^ -128。最重要的是,对输入进行微调可能不是安全的方法。

本文提供了一些示例,说明它们可以证明是安全的构造。最简单的一个似乎是Enc(T,K,M)= AES(K,T x或AES(K,M))。每个块需要两个加密,但是它们证明了此构造的安全性。他们还提到了更快的变体,但是它们需要附加的原语(几乎是xor通用的函数族)。

关于security - 使用Fortuna PRNG :在计数器模式下使用AES进行随机访问加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1459360/

相关文章:

java - 尝试用java创建一个简单的移位密码

c - 使用引擎生成随机数

prng - 什么使 Mersenne Twister 回火功能可逆?

java - 存储在 SD 卡中的安全视频内容,其他应用程序无法访问它

c# - 使用C#删除硬盘驱动器上的可用空间

c# - 生成的线程是否以用户身份自动运行?

javascript - javascript : cipher broken 中的凯撒密码

security - 如何在Hadoop中进行数据加密?

security - OAuth 2.0——有什么新功能?

algorithm - 随机数生成器算法