PRNG通常有一个循环,之后生成的随机数会重复。当SecureRandom的实例创建如下时,SecureRandom of Java的循环是什么:
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
答案 0 :(得分: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]++;
}
没有计数器递增,但内部状态只是用输出更新。
答案 1 :(得分:0)
根据http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA中的说明:
SHA1PRNG:伪随机数生成的名称(PRNG) SUN提供商提供的算法。这个实现如下 IEEE P1363标准,附录G.7:“源位扩展”,和 使用SHA-1作为PRNG的基础。它计算SHA-1哈希 在与64位计数器连接的真随机种子值上 每次操作增加1。从160位SHA-1输出, 只使用64位。
我的结论是周期长度只有2 ^ 64(假设没有内置后门)