Быстрые, безопасные случайные числа
Я искал более быструю альтернативу /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).
Выглядит хорошо. Тем не менее, мой код имеет некоторые очевидные недостатки:
- Оно использует
/dev/urandom
для исходного источника энтропии. - Сила ключа не эквивалентна 448 битам, потому что используются только печатные символы.
- Шифр следует периодически пересеивать, чтобы "разложить" энтропию.
Итак, мне было интересно, нахожусь ли я на правильном пути. И если кто-нибудь знает, как исправить любой из этих недостатков, это было бы здорово. Кроме того, не могли бы вы поделиться тем, что вы используете для безопасного стирания дисков, если это что-то кроме /dev/urandom
, sfill
, badblocks
или DBAN?
Спасибо!
Редактировать: Обновлен код для использования blowfish в качестве потокового шифра.
1 ответ
Если вы просто хотите безопасно стереть диски, вам не нужно особо волноваться о случайности записываемых вами данных. Важно написать все, что вы можете - возможно, пару раз. Что-то намного большее, чем это, является излишним, если только ваш "оппонент" не является крупной правительственной организацией, у которой есть ресурсы, которые можно потратить, чтобы заниматься восстановлением данных (и неясно, что они могут прочитать это даже так - не в наши дни с плотностью дисков) сейчас используется). Я использовал программу GNU 'shred', но меня это беспокоит лишь случайно. Когда я это сделал, я отформатировал дисковую систему на дисковод, затем заполнил ее одним файлом, содержащим квази-случайные данные, а затем уничтожил его. Я думаю, что это было в основном излишним.
Может быть, вам стоит прочесть книгу Шнайера " Криптографическая инженерия"?