Для криптографических целей необходимо, чтобы поток был "вычислительно неотличим от равномерно случайных битов". «В вычислительном отношении» означает, что оно не должно быть действительно случайным, только то, что оно кажется таким никому без доступа к собственному компьютеру Бога.
На практике это означает, что система должна сначала собрать последовательность n действительно случайных битов. n должно быть достаточно большим, чтобы помешать исчерпывающему поиску, т. Е. Будет невозможно испробовать все 2 ^ n комбинаций n битов. Это достигается в отношении современной технологии, если n больше 90 или около того, но криптографы просто любят степени двойки, поэтому обычно используют n = 128 .
Эти n случайных битов получаются путем сбора "физических событий", которые должны быть непредсказуемыми, насколько это касается физики. Обычно используется синхронизация: процессор имеет счетчик циклов, который обновляется несколько миллиардов раз в секунду, и некоторые события происходят с неизбежным количеством дрожания (входящие сетевые пакеты, движения мыши, нажатия клавиш ...). Система кодирует эти события и затем «сжимает» их, применяя криптографически безопасную хеш-функцию, такую как SHA-256 (вывод затем обрезается, чтобы получить наши n биты). Здесь важно то, что для кодирования физических событий достаточно энтропии : грубо говоря, что указанные события могли в совокупности принимать по меньшей мере 2 ^ n комбинаций. Хеш-функция по определению должна хорошо справляться с концентрацией этой энтропии в n -битную строку.
Получив n бит, мы используем PRNG (генератор псевдослучайных чисел), чтобы получить столько битов, сколько необходимо. PRNG считается криптографически защищенным, если, если предположить, что он работает с достаточно широким неизвестным n -битным ключом, его выходная информация неотличима в вычислительном отношении от равномерно случайных битов. В 90-х годах популярным выбором был RC4 , который очень прост в реализации и довольно быстр. Однако оказалось, что он имел измеримые отклонения, то есть он не был столь же неразличим, как первоначально хотелось. Проект eSTREAM заключался в сборе новых проектов для PRNG (фактически потоковых шифров, поскольку большинство потоковых шифров состоят из PRNG, выходные данные которых шифруются данными с помощью XOR), их документировании и проведении анализа криптографами. Портфолио eSTREAM содержит семь проектов PRNG, которые были сочтены достаточно безопасными (то есть они сопротивлялись анализу, а криптографы, как правило, хорошо понимают , почему они сопротивлялись). Среди них четыре «оптимизированы для программного обеспечения». Хорошей новостью является то, что, хотя эти новые PRNG кажутся намного более безопасными, чем RC4, они также заметно быстрее (здесь речь идет о сотнях мегабайт в секунду). Три из них «бесплатны для любого использования», и предоставляется исходный код.
С точки зрения дизайна PRNG повторно использует большинство элементов блочных шифров. Используются те же понятия лавины и диффузии битов в широкое внутреннее состояние. Альтернативно, приличный PRNG может быть построен из блочного шифра: просто используйте последовательность n бит в качестве ключа в блочном шифре и зашифруйте последовательные значения счетчика (выраженные как m -битная последовательность, если блочный шифр использует m -битные блоки). Это создает псевдослучайный поток битов, который в вычислительном отношении неотличим от случайного, при условии, что блочный шифр защищен, а полученный поток не длиннее m * 2 ^ (m / 2) бит ( для m = 128 это означает около 300 миллиардов гигабайт, что достаточно для большинства целей). Этот вид использования известен как режим счетчика (CTR) .
Обычно блочный шифр в режиме CTR работает не так быстро, как выделенный потоковый шифр (смысл потокового шифра в том, что из-за гибкости блочного шифра ожидается повышение производительности). Однако, если у вас есть один из самых последних процессоров Intel с инструкциями AES-NI (которые в основном являются аппаратной реализацией AES, встроенной в ЦП), то AES с режимом CTR даст непревзойденная скорость (несколько гигабайт в секунду).