Быстрые и безопасные случайные числа

Я искал более быструю альтернативу /dev/urandom, когда наткнулся на эта интересная информация:

Один хороший прием для создания очень хороших неслучайных, но почти случайных битов состоит в том, чтобы использовать энтропию /dev/random для заполнения быстрого симметричного потокового шифра (мой любимый — blowfish) и перенаправить его вывод в приложение, которое в нем нуждается.

Это не метод для начинающих, но его легко настроить с помощью двух- или трехстрочного сценария оболочки и некоторых творческих каналов.

Дальнейшее исследование дало следующий комментарий Шнайера о безопасности:

Если вы собираетесь «вводить энтропию», есть несколько способов сделать это, но один из лучших способов — «распространить» ее по высокоскоростному потоковому шифру и соединить с недетерманистической системой выборки.

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

Итак, вот мой взгляд на фактический код:

time dd if=/dev/zero bs=1M count=400 | openssl bf-ofb -pass pass:`cat /dev/urandom | tr -dc [:graph:] | head -c56` > /dev/null

Этот тест скорости берет 400 МБ нулей и шифрует их с помощью blowfish с 448-битным ключом, состоящим из псевдослучайных печатных символов. Вот вывод на моем нетбуке:

400+0 записей на выходе 400+0 записей 419430400 байт (419 МБ) скопировано, 14,0068 с, 29,9 МБ/с

реальный 0m14.025s пользователь 0m12.909s система 0m2.004s

Замечательно! Но насколько это случайно? Давайте направим результаты в ent:

Энтропия = 8 000 000 бит на байт.

Оптимальное сжатие уменьшит размер этого 419430416-байтового файла на 0 процентов.

Распределение хи-квадрат для 4 194 30 416 выборок составляет 250,92, и случайным образом превысит это значение в 50,00 % случаев.

Среднее арифметическое значение байтов данных составляет 127,5091 (127,5 = случайное). Значение Монте-Карло для Пи равно 3,141204882 (ошибка 0,01%). Последовательный коэффициент корреляции составляет -0,000005 (полностью некоррелированный = 0,0).

Это выглядит хорошо. Однако мой код имеет некоторые очевидные недостатки:

  1. Он использует /dev/urandom для исходного источника энтропии.
  2. Сила ключа не эквивалентна 448 битам, поскольку используются только печатные символы.
  3. Шифр следует периодически повторно заполнять, чтобы «распространить» энтропию.

Итак, мне было интересно, на правильном ли я пути. И если кто-нибудь знает, как исправить любой из этих недостатков, это было бы здорово. Кроме того, не могли бы вы поделиться тем, что вы используете для безопасной очистки дисков, если это что-то кроме /dev/urandom, sfill, badblocks или DBAN?

Спасибо!

Редактировать: обновлен код для использования blowfish в качестве потокового шифра.


person user436665    schedule 01.09.2010    source источник
comment
Вас может заинтересовать справочная страница urandom во FreeBSD.   -  person Pascal Cuoq    schedule 01.09.2010
comment
Алгоритм Ярроу звучит многообещающе. Определенно более безопасно, чем то, что я делаю.   -  person user436665    schedule 01.09.2010
comment
У вас есть URL-адрес программы ent?   -  person Jonathan Leffler    schedule 01.09.2010
comment
Пожалуйста. Я бы также рекомендовал тесты Дихардера.   -  person user436665    schedule 02.09.2010
comment
Blowfish не является потоковым шифром, и вы не используете его в режиме, подобном потоковому шифрованию, например. режим счетчика. NIST SP 800-90 включает различные конструкции для этого.   -  person President James K. Polk    schedule 02.09.2010
comment
Спасибо. Я обновил код, чтобы отразить это изменение. Теперь он использует режим OFB.   -  person user436665    schedule 03.09.2010


Ответы (1)


Если вы просто хотите безопасно стереть диски, вам действительно не нужно сильно беспокоиться о случайности записываемых данных. Важно написать все, что возможно, может быть, пару раз. Все, что намного больше, чем это, является излишним, если только ваш «оппонент» не является крупной правительственной организацией, у которой есть ресурсы, чтобы заняться восстановлением данных (и неясно, смогут ли они прочитать это даже в этом случае - не в наши дни с плотностью дисков сейчас используется). Я использовал программу GNU 'shred', но меня это лишь поверхностно беспокоит. Когда я сделал это, я отформатировал дисковую систему на дисководе, затем заполнил его одним файлом, содержащим квазислучайные данные, а затем уничтожил его. Я думаю, что это было в основном излишеством.

Может быть, вам стоит прочитать книгу Шнайера «Cryptography Engineering?

person Jonathan Leffler    schedule 01.09.2010
comment
Я согласен с тем, что использование случайных данных для безопасного стирания дисков — это излишество. Можно просто выполнить один проход /dev/zero и быть в безопасности от злоумышленников, которые не являются мультимиллионерами. Однако, если я купил жесткий диск на 2 ТБ и хочу его зашифровать, я должен сначала заполнить его случайными данными. Спасибо за книгу, поищу. - person user436665; 01.09.2010