【问题标题】:Implementing a Pseudorandom Generator using AES使用 AES 实现伪随机生成器
【发布时间】: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。

一些有用的链接:

【问题讨论】:

  • @MaartenBodewes 我明确指出“我该怎么做?”。这意味着我不希望任何人做我的工作。这意味着“给我方向”,这就是 SE 社区的全部意义所在。我相信我的问题得到了公正的陈述和充分的记录,我不欣赏你的态度。如果您对此线程有什么要提供的,请做。如果你不这样做,那么这些 cmets 根本就没有建设性。根据您在该社区的 5 年经验和令人印象深刻的帐户,您应该知道这一点。
  • 好的,随心所欲。我已经直接回答了你的问题。我个人认为这有点笼统,因为这或多或少解释了 CTR 模式加密,但它确实解释了如何获取 out.length 个字节。
  • 我在PHP 中写了一个,但它使用了 OpenSSL 扩展,应该可以直接在 Java 中引用/重写。

标签: java encryption cryptography aes


【解决方案1】:

在 CTR 模式下,您只需切断不需要的字节(从右侧)在最后一个计数器上加密的块。您也可以通过对正确数量 (out.length) 的零值字节执行 AES-CTR 来创建密钥流。

【讨论】:

  • 检查我是否做对了: 1. 我创建了一个我想要的大小的随机字节数组。 2. 我切断了我不需要的任何字节(如果有的话)。 3. 我对字节数组执行 AES-CTR。
  • 如果你已经有了你想要的尺寸,你当然可以跳过#2。 CTR 本身由计数器值的块加密组成,因此输出总是 N 乘以 16 字节。在这种情况下,您需要在不需要时切断一些字节。如果您只是在 CTR 模式下使用 AES,那么实现已经在内部切断了字节,即在底层 CipherSpi 实例中。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 2016-10-23
  • 2014-05-18
  • 1970-01-01
  • 2015-08-07
  • 2012-02-12
  • 1970-01-01
  • 2011-01-10
相关资源
最近更新 更多