Совершенно случайная одноразовая накладка для шифрования - PullRequest
6 голосов
/ 12 января 2011

Мне нужно создать одноразовую панель для шифрования некоторых данных (размером в несколько килобайт). Как мне следует создать этот одноразовый блокнот, чтобы избежать всех псевдослучайных проблем, связанных с генерацией случайных чисел, таких как rand()?

Существует ли существующий надежный инструмент или библиотека, которую я могу использовать для этого?

Ответы [ 3 ]

5 голосов
/ 12 января 2011

В большинстве современных операционных систем имеется криптографически безопасный генератор псевдослучайных чисел .

Например, Windows имеет CryptGenRandom . Вы можете получить доступ к тому же потоку из .NET с помощью класса RNGCryptoServiceProvider . Из C ++ вы можете получить доступ к тому же потоку, используя библиотечную функцию Microsoft C ++ rand_s . Из Python это доступно с помощью функции urandom (см. Нижнюю часть связанной страницы) в модуле os.

В отличие от обычных PRNG, CSPRNG предназначены для прохождения строгих статистических тестов на случайность. Они также предназначены для того, чтобы хорошо выдерживать серьезные атаки, даже когда их начальное или рабочее состояние становится доступным для атакующего.

Термин «псевдослучайный», используемый криптографами, может вводить в заблуждение нетехнического читателя. CSPRNG расширяет коллекцию случайных значений, называемых начальным числом, в более длинную последовательность чисел. Эта последовательность воспроизводима с учетом начального числа, но для любого хорошего CSPRNG незначительное изменение начального числа дает совершенно другую последовательность. Следовательно, до тех пор, пока по меньшей мере некоторая часть начального числа выбирается с помощью достаточно случайного процесса, злоумышленник не может предсказать результирующую последовательность, даже если злоумышленник может повлиять на оставшуюся часть начального числа.

Многочисленные важные системы, от военных коммуникаций до шифрования, которое защищает практически все онлайн-транзакции, полагаются на функционально-эквивалентную защиту между «криптографически безопасным псевдослучайным» и «случайным».

EDIT : если вам повезло работать с процессорами Intel Ivy Bridge, у вас есть еще одна очень интересная альтернатива .

4 голосов
/ 13 января 2011

Вы не можете генерировать действительно случайные числа алгоритмически - вам нужна аппаратная помощь.Если вы используете алгоритм, хотя и безопасный (например, криптографически безопасный PRNG), вы просто создаете потоковый шифр на основе этого PRNG;это больше не One Time Pad.

4 голосов
/ 12 января 2011

Попробуйте Random.ORG .У них есть различные бесплатные (и платные) сервисы, которые генерируют действительно случайные числа на основе атмосферного шума (или, по крайней мере, это то, что они утверждают, что делают).

...