5

PRNG 通常有一个循环,之后生成的随机数会重复。创建 SecureRandom 的实例时,Java 的 SecureRandom 的循环是什么,如下所示:

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

4

2 回答 2

2

我有点困惑。我查看了 openjdk 的 sun.security.provider.SecureRandom 的代码。这里内部状态更新如下:

digest.update(state);
output = digest.digest();
updateState(state, output);

[...]

private static void updateState(byte[] state, byte[] output) {
    int last = 1;
    int v = 0;
    byte t = 0;
    boolean zf = false;

    // state(n + 1) = (state(n) + output(n) + 1) % 2^160;
    for (int i = 0; i < state.length; i++) {
        // Add two bytes
        v = (int)state[i] + (int)output[i] + last;
        // Result is lower 8 bits
        t = (byte)v;
        // Store result. Check for state collision.
        zf = zf | (state[i] != t);
        state[i] = t;
        // High 8 bits are carry. Store for next iteration.
        last = v >> 8;
    }

    // Make sure at least one bit changes!
    if (!zf)
       state[0]++;
}

没有计数器增加,但内部状态只是用输出更新。

于 2013-09-25T09:49:33.090 回答
0

根据http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA中给出的描述:

SHA1PRNG:SUN 提供商提供的伪随机数生成 (PRNG) 算法的名称。此实现遵循 IEEE P1363 标准附录 G.7:“源位扩展”,并使用 SHA-1 作为 PRNG 的基础。它通过与 64 位计数器连接的真随机种子值计算 SHA-1 哈希,每次操作递增 1。从 160 位 SHA-1 输出中,仅使用了 64 位。

我得出结论,循环长度只有 2^64(假设没有内置后门)

于 2013-09-25T09:13:01.703 回答