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

10

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

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

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

IQAndreas
источник
Как побочный вопрос, это правильное использование «городского мифа» или есть похожая фраза для «мифа в вычислительной технике»?
IQAndreas
1
Я думаю, что эта фраза - городская легенда ; Я никогда не слышал о городских мифах . См. En.wikipedia.org/wiki/Urban_legend В вычислительной технике может быть уместной фраза "грузовой культ" .
Дероберт

Ответы:

8

В этом есть доля правды, на самом деле больше правды, чем мифа, но, тем не менее, утверждение отражает фундаментальное недопонимание того, что происходит. Да, перемещение мыши при генерации ключа с помощью 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, ожидая, пока счетчик энтропии ядра не увеличится.

Жиль "ТАК - перестань быть злым"
источник
За исключением текущих версий Linux, по крайней мере из моего тестирования, не использовать устройства ввода в качестве источника энтропии (или, по крайней мере, оценки энтропии). Я почти уверен, что они изменили это, потому что теоретически они могли быть под контролем злоумышленника.
Дероберт
@derobert Начиная с 3.12, есть призыв к add_input_randomnessin drivers/input/input.c, но я не знаю, при каких обстоятельствах он будет вызывать энтропию.
Жиль "ТАК - перестать быть злым"
Я предполагаю, что это добавляет энтропию, но с оценкой 0 ... Я попробовал и мышь USB, и клавиатуру PS / 2, но ни одна из них не повысила оценку энтропии. Не уверен почему, хотя, как я вижу вызов credit_entropy_bits в коде.
Дероберт
3

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

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

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

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

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

derobert
источник
Также обратите внимание, что вы можете использовать такие инструменты, как rngdискусственное питание энтропийного пула.
Патрик
@ Патрик, и если у вас есть новый чип и вы доверяете АНБ (о, подождите, я имею в виду Intel), вы можете использовать RDRAND.
Дероберт
havegedэто еще один хороший инструмент для искусственного питания энтропийного пула.
mavillan
Это не полная история - ГСЧ не исчерпывает энтропию, она исчерпывает свою внутреннюю меру энтропии. Кроме того, важной частью головоломки является то, что gpg не заботится о мышке, а ядре.
Жиль "ТАК - перестань быть злым"
@ Жиль Я пояснил, что gpg использует Linux RNG. И ошибки в оценке энтропии кажутся за рамками.
Дероберт
0

У Tails чрезвычайно быстрая генерация ключей, потому что он havegedустановил:

sudo apt-get install haveged
user123456
источник