Можно использовать как программную, так и аппаратную генерацию.
1. Программная генерация. Бытует мнение, что такой подход это моветон и использовать его для криптографии нельзя, поскольку программно генерируемые числа обычно имеют псевдослучайную природу. Однако если мы будем использовать для инициализации таких псевдослучайных ГСЧ числа с высокой энтропией, то на выходе ГСЧ уже будет нечто похожее на случайную последовательность, без приставки "псевдо". Мера случайности полученной последовательности определяется при помощи статистических тестов, например
NIST.
Итак, для программной генерации случайных чисел делаем следующее:
A. Берем псевдослучайный ГСЧ, например
регистр сдвига с линейной обратной связью Его можно реализовывать как программно, так и аппаратно, схем в инете куча, таблиц с описанием примитивных многочленов тоже навалом (можно посмотреть хотя бы в ссылках к приведенной выше статье на вики).
Б. Берем откуда-то число с некоторой энтропией (неопределенностью). В качестве такого числа можно взять, например, младшие биты системного времени, а если в микроконтроллере системных часов нет - то содержимое таймера-счетчика. Поскольку числа вы будете генерить в произвольные моменты времени, полученное таким образом число претендует на случайность.
В. Инициализируем полученным выше числом ваш псевдослучайный ГСЧ , например рассмотренный регистр сдвига с линейной ОС. И гоняем этот регистр некоторое количество тактов, которое может определятся содержимым другого таймера. То, что получилось в результате берем в виде случайного числа.
Г. Последовательность сгенерированных случайных чисел проверяем при помощи статистического теста, если полученная мера случайности устраивает - пользуетемся созданным генератором.
2. Аппаратная генерация Выше уже предлагали схему измерения шума полупроводникового диода, а я предложу цифровую схему, которую Intel использует для аппаратной генерации случайных чисел в процессорах микроархитектуры IVY BRIDGE. Вот ссылки на статьи в которых описывается такой генератор:
1,
2,
3В двух словах суть предложенного в Intel подхода сводится к следующему. Если ввести бистабильную ячейку (RS триггер) в метастабильное состояние, то под воздействием тепловых шумов RS триггер случайно перейдет либо в 0, либо в 1. Распределение полученных случайных чисел, как я понимаю, будет такое же, как и у теплового шума. Чтобы перевести триггер в метастабильное состояние, необходимо подать одинаковое напряжение на входы R и S. Это может быть либо R=S=0 (для RS триггера в базисе И-НЕ), либо R=S=1 (для RS триггера в базисе ИЛИ-НЕ). Допустим мы работаем с триггером в базисе ИЛИ-НЕ и подали на его входы две единицы. На прямом и инверсном выходах тригера появятся логические нули. Далее, когда мы подадим на входы два нуля вместо двух единиц, прямой выход триггера случайно перейдет либо в 0, либо в 1. Нужно только, чтобы напряжения на R и S входах переходили из 1 в 0 одновременно. Если это требование нарушить, энтропия существенно снизиться. Эту проблему можно решать добавлением к RS триггеру отрицательной обратной связи, что и сделала Intel в своей разработке. Более детально механизм работы данного ГСЧ и его статистические тесты рассмотрены в приведенных выше статьях.