So this is a good start
for a basic design for pseudo-random number generator
We have some pool of randomness.
We extract a seed from that pool.
We use that seed as the key
to our encryption algorithm.
And as the messages
we use a counter.
So, lets suppose we use AES-128,
so that means the key size and
the block size are 128 bits
and so each time we do this,
we get a 128 bits out,
which we use as our random values.
And this counter
will go up to (2^128)-1
and then go back to zero.
So now, I have a quiz
about how well this works.
So the question is does this produce a
sequence that appears random and lets say—
for the first 2^70 outputs—?
So certainly if we have more than
2^128 outputs,
well, these counter values repeat.
So that would be non-random.
The choices are ‘yes’,
‘no, because it repeats values too frequently,’
or ‘no, because it repeats values too infrequently’.
Неплохой задел для генератора псевдослучайных чисел.
У нас есть источник случайности, мы можем получить зерно
как ключ для нашего алгоритма шифрования,
а в качестве сообщений мы используем счетчик.
Допустим, мы используем алгоритм AES-128.
Это означает, что размер и ключа, и блока - 128 бит.
Поэтому на каждом шаге мы получаем 128 бит, которые используем как случайное число.
Этот счетчик будет расти до двух в степени 128 минус 1
и потом вернется к нулевому значению.
Теперь задача о том, насколько правильно это работает.
Вопрос такой: получаем ли мы последовательность, которая выглядит случайной
на протяжении, скажем, первых 2 в 70-й степени значений?
Разумеется, если у нас больше 2 в степени 128 значений,
то значения счетчика будут повторяться, то есть уже не будут случайными.
Поэтому варианты такие: - да
- нет, потому что значения повторяются слишком часто
- нет, потому что значения повторяются недостаточно часто.