Добавление «случайной числовой энтропии» для ключей GPG?

В следующем видео: Linux HOWTO: защитите свои данные с помощью PGP, часть 2 , вам показано, как создать пару ключей с gpg . Примерно в 1:50 инструктор говорит следующее:

В то время как ключ генерируется, неплохо немного передвинуть мышь, чтобы дать ему немного более случайную числовую энтропию для создания пары ключей.

Это кажется мне мифом, тем более, что курсор обычно не влияет на инструменты командной строки. С другой стороны, я не знаю, как работает генератор случайных чисел Linux, независимо от того, используется ли он графическим интерфейсом или независим от него. Есть ли какой-либо запас в том, что он утверждает, или это пример программирования культа ?

В этом есть доля правды, на самом деле больше правды, чем миф, но, тем не менее, утверждение отражает фундаментальное непонимание того, что происходит. Да, перемещение мыши при создании ключа с помощью GPG может быть хорошей идеей. Да, перемещение мыши способствует некоторой энтропии, которая делает случайные числа случайными. Нет, перемещение мыши не делает ключ более безопасным.

Все хорошие случайные генераторы, подходящие для криптографии, и Linux в этой категории, имеют два компонента:

  • Источник энтропии , который не является детерминированным. Целью энтропии является загрузка исходного генератора случайных чисел с непредсказуемыми данными. Источник энтропии должен быть недетерминированным: в противном случае противник может воспроизвести один и тот же расчет.
  • Генератор псевдослучайных чисел , который производит непредсказуемые случайные числа детерминированным образом из изменяющегося внутреннего состояния.

Энтропия должна поступать из источника, который является внешним по отношению к компьютеру. Пользователь является одним из источников энтропии. То, что делает пользователь, в основном не случайное, но тонкое время нажатия клавиш и движений мыши настолько непредсказуемо, чтобы быть немного случайным – не очень случайным, но постепенно, он накапливается. Другие потенциальные источники энтропии включают время сетевых пакетов и белый шум камеры или микрофона. В разных версиях и конфигурациях ядра может использоваться другой набор источников. На некоторых компьютерах имеются специализированные аппаратные схемы RNG, основанные на радиоактивном распаде или, что менее впечатляюще, неустойчивые электронные схемы. Эти выделенные источники особенно полезны во встроенных устройствах и серверах, которые могут иметь довольно предсказуемое поведение при первой загрузке, без необходимости делать странные вещи.

Linux предоставляет случайные числа для программ через два устройства: /dev/random и /dev/urandom . Чтение с любого устройства возвращает криптографическое качество. Оба устройства используют одно и то же внутреннее состояние RNG и тот же алгоритм для преобразования состояния и создания случайных байтов. У них есть своеобразные ограничения, из-за которых никто из них не прав:

  • /dev/urandom может вернуть прогнозируемые данные, если система еще не накопила достаточную энтропию.
  • /dev/random вычисляет количество доступной энтропии и блоков, если этого недостаточно. Это звучит хорошо, за исключением того, что расчет основан на теоретических соображениях, которые делают количество доступной энтропии линейно уменьшающимся с каждым выходным битом. Таким образом, /dev/random имеет тенденцию блокироваться очень быстро.

Системы Linux сохраняют внутреннее состояние RNG на диск и восстанавливают его во время загрузки. Поэтому энтропия переносится с одной загрузки на другую. Единственный момент, когда система Linux может испытывать недостаток энтропии, – это когда она только что установлена. Когда в системе имеется достаточная энтропия, энтропия не уменьшается; только недостаток в Linux уменьшается. Для более подробного объяснения этого соображения, read /dev/urandom подходит для создания криптографического ключа профессиональным криптографом. См. Aso. Можете ли вы объяснить оценку энтропии, используемую в random.c .

Перемещение мыши добавляет больше энтропии в систему. Но gpg может читать только из /dev/random , not /dev/urandom (способ решить эту проблему – сделать /dev/random одним и тем же устройством 1: 9 как /dev/urandom ), поэтому он никогда не подвергается риску получая неслучайные случайные числа. Если вы не перемещаете мышь, ключ такой же случайный, какой может быть; но может случиться, что gpg может быть заблокирован при чтении из /dev/random , ожидая, когда энтропийный счетчик ядра поднимется.

GPG использует генератор случайных чисел Linux (ядро). Генератор ядра получает энтропию (случайность) из всех видов мест, среди которых время прерывания, для определенных прерываний. Перемещение мыши (и набрав, активность диска и т. Д.) Все вызовет прерывания.

Таким образом, перемещение мыши действительно потенциально подается в генератор случайных чисел. Но независимо от того, зависит ли это от используемой версии ядра; более новые версии (по крайней мере, в моем тестировании) не используют прерывания клавиатуры или мыши для энтропии. Однако активность диска (так, например, при запуске sync добавит потенциально большое количество энтропии, в зависимости от того, насколько сильно покраснеть).

Короче: это не так для текущих версий Linux. Это было на старых.

Однако, если генератор заканчивается энтропией, он должен просто остановиться, поэтому ваше генерирование ключей будет зависать до тех пор, пока не будет создана какая-то энтропия. Так что это была бы проблема навсегда, а не проблема безопасности.

Вы можете видеть, сколько энтропии доступно для cat /proc/sys/kernel/random/entropy_avail .

У Tails очень быстрое поколение ключей, потому что оно уже установлено:

 sudo apt-get install haveged