Java的SecureRandom循环

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

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

我有点困惑。 我查看了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]++; } 

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

根据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(假设没有内置后门)