Быстрые, безопасные случайные числа - PullRequest
0 голосов
/ 01 сентября 2010

Я искал более быструю альтернативу /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 Ответ

1 голос
/ 01 сентября 2010

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

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

...