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

Я искал более быструю альтернативу /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 sys 0m2.004s

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

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

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

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

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

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

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

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

Спасибо!

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

1 ответ

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

Может быть, вам стоит прочесть книгу Шнайера " Криптографическая инженерия"?

Другие вопросы по тегам