使用AES作为携带真正随机种子的便携式RNG?

时间:2016-04-30 02:31:36

标签: c encryption random cryptography

我正在编写一项服务,其中需要在不共享代码库的多个平台上使用确定性RNG(可能除了C之外)。随机数需要精确到128位。鉴于预先协商的真正随机数,如果我使用AES生成一系列随机数,是否可以?如何工作是我会加密种子以获得第一个随机数,加密第一个随机数以获得第二个,等等。

基本上:

rand[0] = truly_random_number;
rand[1] = AES(truly_random_number);
rand[2] = AES(AES(truly_random_number));
rand[n] = AES(AES(AES...AES(truly_random_number...))) //n times

此处的一个参数AES定义为明文始终为全零。

客户将在他们通信时共享他们的序列号,因此他们中的任何一个都应该可以确定地重建所需的结果。

这是否正确使用AES?我可以使用更快的东西,比如SHA-256并截断结果吗?我应该找到一些RNG的C实现并使用它吗?我倾向于AES,因为我所针对的平台都有AES加速器,因此速度不应该是一个问题。

3 个答案:

答案 0 :(得分:1)

我认为这样做最好是黑客。

AES是一种加密算法,而不是随机数生成算法。我不希望一遍又一遍地应用AES来产生良好的随机性。

您提到您并担心性能并希望使用AES硬件。 AES硬件加速的原因是AES相当复杂。然而,大多数PRNG都不是;例如,xorshift只有几个xor和shift操作。您还需要依赖具有AES加速器的目标硬件。

从某个地方获得一个体面的C PRNG图书馆(他们不难找到),用你的共享随机数播种它,并留在那里。

答案 1 :(得分:0)

您应该阅读以下内容,它可以链接到PRNG的其他参考资料

http://c-faq.com/lib/rand.html

不要做你正在做的事情,除非你在同行评审的文献中找到一些可行的东西,即使这样我也要小心对待它。如果你想要一个便携式PRNG,那么上面链接中给出的那个是

#define a 48271
#define m 2147483647
#define q (m / a)
#define r (m % a)

static long int seed = 1;

long int PMrand()
{
    long int hi = seed / q;
    long int lo = seed % q;
    long int test = a * lo - r * hi;
    if(test > 0)
        seed = test;
    else    seed = test + m;
    return seed;
}

请注意文档底部附近a的更改。你也应该不相信我刚刚写的东西,即做你的功课,并确保上面的或其他一些PRNG适用于你的应用程序。

答案 2 :(得分:0)

您未说明您的安全要求。如果您想要一个加密安全的解决方案,那么您的问题并非易事。有关一种可能的解决方案,请参阅A Block Cipher based Pseudo Random Number Generator Secure Against Side-Channel Key Recovery

由于安全要求,这样的RNG会很慢。正如三十二上校所说,你的问题可以通过一个非加密的RNG来解决,它会更快并且可能更容易维护。