В этом есть доля правды, на самом деле больше правды, чем мифа, но, тем не менее, утверждение отражает фундаментальное недопонимание того, что происходит. Да, перемещение мыши при генерации ключа с помощью GPG может быть хорошей идеей. Да, перемещение мыши вносит энтропию, которая делает случайные числа случайными. Нет, перемещение мыши не делает ключ более безопасным.
Все хорошие генераторы случайных чисел, подходящие для криптографии, и Linux в этой категории, имеют два компонента:
- Источник энтропии , который является недетерминированным. Цель энтропии - запустить генератор случайных чисел с непредсказуемыми данными. Источник энтропии должен быть недетерминированным: в противном случае противник может воспроизвести те же вычисления.
- Генератор псевдослучайных чисел , который производит непредсказуемые случайные числа в детерминированных модах от изменяющегося внутреннего состояния.
Энтропия должна исходить от внешнего источника по отношению к компьютеру. Пользователь является одним из источников энтропии. То, что делает пользователь, в основном не случайно, но точная синхронизация нажатий клавиш и движений мыши настолько непредсказуема, что может быть немного случайной - не очень случайной, но постепенно, она накапливается. Другие потенциальные источники энтропии включают синхронизацию сетевых пакетов и белый шум камеры или микрофона. Различные версии и конфигурации ядра могут использовать различный набор источников. Некоторые компьютеры имеют выделенные аппаратные схемы ГСЧ, основанные на радиоактивном распаде или, что менее впечатляюще, нестабильные электронные схемы. Эти выделенные источники особенно полезны во встроенных устройствах и серверах, которые могут иметь довольно предсказуемое поведение при первой загрузке, без необходимости делать странные вещи.
Linux предоставляет случайные числа программам через два устройства: /dev/random
и/dev/urandom
. Чтение с любого устройства возвращает криптографическое качество. Оба устройства используют одно и то же внутреннее состояние RNG и один и тот же алгоритм для преобразования состояния и создания случайных байтов. У них есть своеобразные ограничения, которые не делают ни одного из них правильным:
/dev/urandom
может вернуть предсказуемые данные, если система еще не накопила достаточную энтропию.
/dev/random
вычисляет количество доступной энтропии и блоков, если их недостаточно. Это звучит хорошо, за исключением того, что вычисления основаны на теоретических соображениях, которые заставляют количество доступной энтропии линейно уменьшаться с каждым выходным битом. Таким образом, /dev/random
имеет тенденцию блокировать очень быстро.
Системы Linux сохраняют внутреннее состояние RNG на диске и восстанавливают его во время загрузки. Поэтому энтропия переносится с одного ботинка на другой. Единственный раз, когда системе Linux может не хватать энтропии, это когда она только что установлена. Когда в системе достаточно энтропии, энтропия не уменьшается; уменьшается только ошибочный расчет Linux. Для более подробного объяснения этого соображения read /dev/urandom
подходит для генерации криптографического ключа профессиональным криптографом. Смотрите также. Можете ли вы объяснить оценку энтропии, используемую в random.c .
Перемещение мыши добавляет энтропии в систему. Но gpg может только читать /dev/random
, а не/dev/urandom
(способ решить эту проблему - сделать /dev/random
то же самое устройство 1: 9, что и /dev/urandom
), поэтому он никогда не рискует получить не случайные числа. Если вы не двигаете мышь, клавиша настолько случайна, насколько это возможно; но может случиться так, что gpg может заблокироваться при чтении /dev/random
, ожидая, пока счетчик энтропии ядра не увеличится.