寻找可以使用任意数字字节播种的PRNG

时间:2010-01-29 06:43:31

标签: c# .net random prng

我正在寻找一个PRNG(伪随机),你最初用任意数组的字节种子。

听说过什么?

2 个答案:

答案 0 :(得分:3)

散列你的任意长度的种子(而不是像建议的paxdiablo那样使用XOR)将确保冲突极不可能,即等于哈希冲突的概率,例如SHA1 / 2这是实际上不可能的。

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

<强>更新

此处提供的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,66轮中的46轮SHA-512,时间为2 ^ 511.5,空间为2 ^ 3 。第二个攻击42轮SHA-256,时间复杂度为2 ^ 251.7,空间复杂度为2 ^ 12,42轮SHA-512,时间为2 ^ 502,空间为2 ^ 22。

答案 1 :(得分:2)

为什么不将你的任意序列与一个正确长度的类型进行异或(如果需要,用自己的一部分填充它)?例如,如果你想要种子“paxdiablo”而你的PRNG有一个四字节的种子:

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

我知道种子看起来是人为的(因为密钥是从字母字符中选择的)。如果你真的想让这个短语很可能来自一个相似的范围,那么再次使用0xdeadbeef0xa55a1248这样的区别对象进行异或:

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

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