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 に答える