0

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

听说过吗?

4

2 回答 2

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

于 2010-02-01T10:52:22.563 回答
2

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

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

我知道种子看起来是人造的(这是因为密钥是从字母字符中选择的)。如果您真的想让短语可能来自相似范围的地方变得不同,请再次使用类似 or 的微分器对其进行异0xdeadbeef0xa55a1248

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

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

于 2010-01-29T06:52:00.790 回答