我正在写一个服务,其中不共享代码库的多个平台都需要确定性的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加速器,所以速度应该不是太大的问题。
发布于 2016-04-30 10:42:30
我认为这样做充其量只是一种黑客行为。
AES是一种加密算法,而不是随机数生成算法。我不期望一遍又一遍地应用AES来产生像样的随机性。
您提到您担心性能问题,并希望使用AES硬件。AES硬件加速的原因是AES相当复杂。然而,大多数PRNG并非如此;例如,xorshift只是一些xor和shift操作。您还需要依赖于具有AES加速器的目标硬件。
从某个地方获得一个像样的C PRNG库(它们并不难找到),用你共享的随机数来播种它,然后把它留在那里。
发布于 2016-04-30 11:34:41
您应该已经阅读了以下内容,其中包含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适用于你的应用程序。
发布于 2016-05-02 23:32:35
您没有说明您的安全需求。如果您想要一个加密安全的解决方案,那么您的问题就不是微不足道的。有关一种可能的解决方案,请参阅A Block Cipher based Pseudo Random Number Generator Secure Against Side-Channel Key Recovery。
由于安全性要求,这样的RNG将会很慢。正如三十二上校所说,非加密RNG可能会更好地解决你的问题,它会更快,也更容易维护。
https://stackoverflow.com/questions/36950053
复制相似问题