“伪随机生成器(PRG)是一种确定性算法,它采用称为种子的短均匀分布的字符串,并输出一个较长的字符串,该字符串无法与该长度的均匀分布的字符串有效区分。” [1]
据我了解,我们可以使用流密码创建伪随机生成器。例如,安全多方计算API SCAPI使用following example中的RC4创建固定字节数的输出(检查out.length
):
//Create secret key and out byte array
...
//Create prg using the PrgFactory
PseudorandomGenerator prg = PrgFactory.getInstance().getObject("RC4");
SecretKey secretKey = prg.generateKey(256); //256 is the key size in bits.
//set the key
Prg.setKey(secretKey);
//get PRG bytes. The caller is responsible for allocating the out array.
//The result will be put in the out array.
prg.getPRGBytes(out.length, out);
实际上,伪随机生成器在某些加密协议(即this protocol)中特别有用,其中我们需要创建快速通常具有非常大的字节的伪随机输出。
我实际上使用上面显示的PRG部分的SCAPI片段实现了this协议。然而作者不是使用RC4作为他们的PRG,而是在CTR模式下使用AES128。这是有道理的,因为众所周知RC4已被打破,因为AES can be easily used as stream cipher。
我想在CTR中使用AES以与上面代码段相同的方式实现伪随机生成器,但我无法这样做。我的问题不是在CTR中使用AES,在线有无数的例子。我的问题是out.length
部分。 我不知道如何使用AES (or any other cipher for that matter)实现PRG,我可以选择输出字节的确切数量,如上例所示。我该怎么做?
在有人提到哈希函数可以执行相同的工作之前:实际上,这基本上是一个哈希函数,但这个特定协议的问题是我们需要非常大的输出(即32MB)散列函数通常具有固定输出(192,256,512位)。
最后,这个问题与this问题并不重复,因为后者是关于在Python中实现任何类型的PRG,其中一个是关于在Java中实现基于AES_CTR的PRG。
一些有用的链接:
答案 0 :(得分:2)
在CTR模式下,您只需切断在最后一个计数器上加密的块所需的字节(从右侧)。您也可以通过对零值字节的正确数字(out.length
)执行AES-CTR来创建密钥流。