寻找PRNG,你可以用任何数字字节播种

我正在寻找一种PRNG(伪随机),您最初使用任意字节数组进行播种。

听说过吗?


散列任意长度的种子(而不是像建议的paxdiablo那样使用异或)将确保碰撞是极不可能的,即等于散列冲突的概率,与诸如SHA1 / 2之类的事情相比,这实际上是不可能的。

然后你可以使用你的散列种子作为一个体面的PRNG的输入,例如我最喜欢的Mersenne Twister。

UPDATE

此处提供的Mersenne Twister实现似乎已接受任意长度的键:http://code.msdn.microsoft.com/MersenneTwister/Release/ProjectReleases.aspx?ReleaseId=529

更新2

要分析SHA2碰撞发生的可能性不大,请看http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-2:

有两次针对SHA-2的中间会见原像攻击,并减少了回合次数。 第一次在64轮中攻击41轮SHA-256,时间复杂度为2 ^ 253.5,空间复杂度为2 ^ 16,80轮中有46轮SHA-512,时间为2 ^ 511.5,空间2 ^ 3 。 第二次攻击的时间复杂度为2 ^ 251.7,空间复杂度为2 ^ 12的42轮SHA-256,以及时间2 ^ 502和空间2 ^ 22的42轮SHA-512。


你为什么不只是将你的任意序列异或成一个正确长度的类型(如果有必要,用它的一部分填充它)? 例如,如果您想要种子“paxdiablo”,并且您的PRNG具有四字节种子:

paxd    0x70617864
iabl    0x6961626c
opax    0x6f706178
        ----------
        0x76707b70 or 0x707b7076 (Intel-endian).

我知道种子看起来很人造(因为这个键是从字母中选择的)。 如果你真的想让这个短语可能来自一个类似的范围,那么XOR再次使用0xdeadbeef0xa55a1248这样的0xa55a1248

paxd    0x70617864    0x70617864
iabl    0x6961626c    0x6961626c
opax    0x6f706178    0x6f706178
        0xdeadbeef    0xa55a1248
        ----------    ----------
        0xa8ddc59f    0xd32a6938

我更喜欢第二个,因为它更容易将相似的字节移动到不同的范围内(差分器中字节的高位不同)。

链接地址: http://www.djcxy.com/p/37263.html

上一篇: Looking for PRNG that you can seed with any number bytes

下一篇: Simple integer encryption