【发布时间】:2016-03-08 18:08:34
【问题描述】:
“伪随机生成器 (PRG) 是一种确定性算法,它采用一个短的均匀分布的字符串(称为种子),并输出一个较长的字符串,该字符串无法有效地与该长度的均匀分布的字符串区分开来。” [1]
据我了解,我们可以使用流密码创建伪随机生成器。例如,SCAPI,一个安全多方计算 API,使用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 sn-p 实现了this 协议。然而,作者并没有将 RC4 用于他们的 PRG,而是在 CTR 模式下使用 AES128。这是有道理的,因为众所周知 RC4 已被破坏并且因为AES can be easily used as stream cipher。
我想以与上面的 sn-p 相同的方式在 CTR 中使用 AES 实现伪随机生成器,但我无法这样做。我的问题是没有在 CTR 中使用 AES,网上有无数的例子。我的问题是out.length 部分。 我不知道如何使用 AES 实现 PRG (or any other cipher for that matter) 我可以选择确切的输出字节数,如上面的示例。我该怎么做?
在有人提到散列函数可以做同样的工作之前:事实上,这基本上是一个散列函数,但这个特定协议的问题是我们需要非常大的输出(即 32MB),其中散列函数通常具有(192、256、512 位)的固定输出。
最后,这个问题与this 不重复,因为后者是关于在 Python 中实现任何类型的 PRG,而这是关于在 Java 中实现基于 AES_CTR 的 PRG。
一些有用的链接:
- SCAPI 的API
- SCAPI 在 PRG 上的 source code
【问题讨论】:
-
@MaartenBodewes 我明确指出“我该怎么做?”。这意味着我不希望任何人做我的工作。这意味着“给我方向”,这就是 SE 社区的全部意义所在。我相信我的问题得到了公正的陈述和充分的记录,我不欣赏你的态度。如果您对此线程有什么要提供的,请做。如果你不这样做,那么这些 cmets 根本就没有建设性。根据您在该社区的 5 年经验和令人印象深刻的帐户,您应该知道这一点。
-
好的,随心所欲。我已经直接回答了你的问题。我个人认为这有点笼统,因为这或多或少解释了 CTR 模式加密,但它确实解释了如何获取 out.length 个字节。
-
我在PHP 中写了一个,但它使用了 OpenSSL 扩展,应该可以直接在 Java 中引用/重写。
标签: java encryption cryptography aes