Я искал более быструю альтернативу /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 в качестве потокового шифра.