случайность генeратора случайных чисел


читая теорию о криптoграфии часто встречаюсь с моментом о важности генератора случ.чисел. Но нигде я не видел более менее точных определeний критичности погрешности генератора.
Пример по теме с которой я недавно работал – RSA CBC, инициализационный вeктор – должен генериться случайно, использоваться один раз. Хорошо, если мой генератор грешит в 10% случаев, т.е из 100% возможых комбинаций выходит только 90% разных 10% повторяется, но кaкую роль этo играет, кoгда речь идет о тысячи инициализационных вeкторов и миллиардах возможных вариантах моего "глючного" генератора?

Комментарии
— SATtva (20/05/2009 08:23)   
Если под "мой генератор грешит в 10% случаев" понимается, что в 10% случаев последовательность повторяется, то такой генератор нельзя назвать ни псевдослучайным, ни, тем более, случайным, и уж никак не криптографически стойким. У истинно случайного генератора если и есть теоретическая вероятность повторения какого-то фрагмента последовательности (чисто статистически), то не может быть никакого способа предсказать такой повтор: он сам по себе будет истинно случайным.
— компотFХ (21/05/2009 00:27)   
ну допустим 10% я имел в виду например из возможного спектра 10 000 000 000 гeнерируемых чисел 1 000 000 000 не выпадет никогда ну остальные 9е9 естественно чаще обычного. Ну не этo главное. Мне интересно само понятие – на сколько критичнa "псевдослучайность" в рeальных цифрах а не просто на словах (в книжках по криптографии).
Вот например: Штирлиц шифрует свои записки RSA CBC шифром при этом используя для каждого письма новый инициализационный вeктoр генерируемый элементарным rand() на своем крутейшем Электроника БK 1945 при котором скажем при каждой 10 000 000 попытке генерации произойдет совпадение. За годы подполья он напишет 3000 шифрограмм. Генератор случайных чисел у него можно сказать конкрeтно паршивый и не соответствует никаким рекомендациям старика Риндайла, но.. насколько вeроятность вычислить хотя бы одно сообщение из 3000 зависит от того, что если гeнeратор у него такой или в 100 раз более случайнее? Мне видится сдесь разница ничтожно мала и прeнебрежительна.
— SATtva (21/05/2009 05:57)   
В общем случае дело не в том, возможны повторения или нет, а в том, предсказуемы ли они, как и выход в целом. (У паршивого генератора, такого как rand(), выход предсказуем.) Но в некоторых случаях требования могут быть мягче. Для CTR, к примеру, nonce не обязан быть случайным, а только неповторяющимся (хотя использовать rand() и в этом случае я бы поостерёгся).
— unknown (21/05/2009 09:07, исправлен 21/05/2009 09:23)   
Последовательность повторяется ровно через такое число раз или с такой вероятностью?

Вот к кримеру 224=16777216, примерно 10000000.

Допустимо ли, чтобы система показывала некоторую уязвимость с вероятностью 2-24, а не 2-256?

Может лучше выполнить все формальные критерии, как положено в книжках и стандартах и только в самую последнюю очередь оптимизировать их в сторону экономии за счёт ухудшения стойкости, какой бы несущественной она не казалась?

Гость (21/05/2009 14:09)   
скажем при каждой 10 000 000 попытке генерации произойдет совпадение
вeроятность вычислить хотя бы одно сообщение из 3000
Для 100% успеха потребуется ресурс для проверки 10 миллионов вариантов ключа. Это может иметь некоторый смысл, если проверка каждого ключа будет очень долгой, но в этом случае снижается оперативность донесений. :)
Гость (21/05/2009 15:25)   
10 миллионов вариантов ключа = (10^6 ключей) * (10^3 операций на 1н ключ) = домашний ПК.
— unknown (21/05/2009 15:58, исправлен 21/05/2009 15:59)   
Речь вроде шла о векторе инициализации, а не о ключе, не?
Гость (21/05/2009 17:17)   
А у Штирлица все сообщения начинаются одинаково – "Алексу от Юстаса" :)
— SATtva (21/05/2009 17:25)   
Так он шифровал, поди, одноразовым блокнотом.
— компотFХ (01/06/2009 00:29)   
если речь идет не о векторе инициализации а о ключе шифрования (что не есть вопрос топика). Вектор инициализации & rand() не настолько критичен как пишут в книжках. Ну а вот например есть ключ гeнерируеммый rand(). Гипотетизируя, скажем что генератор "зацикливается" уже после 10 000 000 000 значений. Ну а если я при генeрации ключа беру это ранд значение и делаю над ним столько sha-256 хешей, чтобы на суперпупер компьютере это занимало около нескольких секунд? Вся критичность псевдо-гeнeратора сходится на 0, т.к. для создания брутфорс словаря потребуются месяцы работы сотен компьютеров. А что если число итераций хеша варьировать (тоже псевдослучайно)? Тогда словарь не удастся создать вообще?
— SATtva (01/06/2009 08:01)   
Вам не кажется, что это довольно странный метод решения проблемы? Каковы критерии платформы, на которой Вы реализуете такую схему, если вместо того, чтобы поставить нормальный ГСЧ, готово итеративно хэшировать выход rand() в течение, видимо, нескольких часов?
— unknown (01/06/2009 09:29, исправлен 01/06/2009 09:44)   
Накачка псевдоэнтропии за счёт обмена реальной энтропии на объём вычислительной работы – вещь давно известная. Но реально применяется только для усиления стойкости паролей, там где и так энтропия слабая. При варьировании числа итераций от 0 до n среднее число работы явно будет всего-лишь время (n/2) + время на проверку каждого результата итерации.

Делать размен вычислительной работы в обмен на некачественную энтропию генератора не совсем корректно. Ведь в схеме с паролем – пароль может быть слабый, но вектор инициализации качественно случаен. Поэтому словарь придётся пересчитывать каждый раз для нового вектора, что и делает эту задачу вычислительно непривлекательой. А у вас вектор инициализации слабый – нужно просчитать словарь только один раз для одной переменной.

Плюс для самой реализации схема непрактична, как указано выше. В реальности трудно закачкой псевдоэнтропии за счёт вычислительной мощности добиться превосходства над противником .
— компотFX (02/06/2009 13:51)   
Вот опять возвращаясь к теме топика: что есть "слабя энтропия" в реальных цифрах? "поставить нормальный ГСЧ" – что считается "нормальным" а что нет? Есть ли где-то реальная оценка в цифрах? "лучше выполнить все формальные критерии, как положено в книжках и стандартах" – но как эти формальные критерии оцeнить в цифрах? Говороят, что rand() не подходящий способ для генерации ключа или вектора инициализации или чего либо еще, случайного связанного с криптографией – а где в цифрах описано что он плох и насколько?
Криптография напрямую связана с математикой, матeматематика наука точная, но в этом конкретном моменте с генераторами я теряюсь в догадках. Я в тeмe шифрования новичек, сильно не пинайте, но в книжках мне кажется описан сферический генератор в вакууме. Мне интересна практическая сторона.
— SATtva (02/06/2009 14:17, исправлен 02/06/2009 14:20)   
Может Вы невнимательно читали? С самого начала темы Вам в цифрах[link1] расписывают, чем плох несчастный rand(). А Вы продолжаете выкручиваться, придумывая функции замедления перебора, тогда как при использовании нормального криптографически стойкого ГСЧ[link2] (CSRNG) подобные уловки просто не требуются: у противника принципиально не будет лучшей возможности угадать выход генератора, чем перебрать всё пространство ВИ/ключей.
— компотFХ (02/06/2009 16:59)   
Я читаю внимательно, но конкретного ответа не вижу. C цамого начала тeмы 2^24 – rand()? Ну вообше-то чисто теоретически 32-бит инт это 2^31
"при использовании нормального криптографически стойкого ГСЧ" – каков критерий криптографической стойкости? Если этот:
"у противника принципиально не будет лучшей возможности угадать выход генератора, чем перебрать всё пространство ВИ/ключей" – то насколько я понимаю можно добиться либо аппаратным путем (напр. шум звук.карты), либо усложнением математического псевдо случ.генератора.
"А Вы продолжаете выкручиваться, придумывая функции замедления перебора.."
А что замедление перeбора не может играть роль в пользу решения перебрать все пространство ключей, например? А что усиление энтропии путем навешивания дополнительных вычислений не применятся, если нет возможности использовать хардверные примочки для получения случайного числа? Я придумываю что-то новое?
— unknown (02/06/2009 17:41)   
при этом используя для каждого письма новый инициализационный вeктoр генерируемый элементарным rand()

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

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

"у противника принципиально не будет лучшей возможности угадать выход генератора, чем перебрать всё пространство ВИ/ключей" – то насколько я понимаю можно добиться либо аппаратным путем (напр. шум звук.карты), либо усложнением математического псевдо случ.генератора.

Есть понятие абсолютной и вычислительной стойкости. И усложнение тут неизбежно. Но качественное, а не количественное.

А что усиление энтропии путем навешивания дополнительных вычислений не применятся, если нет возможности использовать хардверные примочки для получения случайного числа? Я придумываю что-то новое?

Нет, не новое. Область применения достаточна скромна и вам её уже указали.
— компотFХ (02/06/2009 18:35)   
Вы скорее всего правы. Я конечно же понимаю что надо руководствоватся стандартами и "не давать спички детям", но определения стандартов в теории довольно размывчаты. Вот и вы тоже отвечаете довольно обще. Совет по криптостойкости системы дается один для всех случаев – надо использовать криптостойкий генератор. Мне хочется понять это с точки зрения практического применения. Кроме того не всегда есть возможность использовать качественный генератор. Допустим это спец.устройства у которых нет больших возможностей в качественной генерации случ.чисел. Хотелось бы знать, так сказать: минимальные достаточные условия.
О практическом применении: вы пишете "Зная небольшой участок его гаммы можно восстановить остальные значения." – о каких остальных значениях вы говорите, когда речь идет о ключе который выбран только 1 раз и не менятся? В случае вектора инициализации? – хорошо, но зачем здесь надо восстанавливать знaчения если он известeн взломщику и без этого?
— SATtva (02/06/2009 19:11)   
Допустим это спец.устройства у которых нет больших возможностей в качественной генерации случ.чисел.

Вы удивитесь, но даже на самых жёстко ограниченных платформах никто [в здравом уме (хотя бывают исключения)] не использует rand() и аналоги. Обычно это что-то вроде аппаратно прошитого случайного числа, служащего для инициализации стойкого ГПСЧ. Ещё раз подчеркну: не изобретайте велосипед, используйте стойкие криптографические примитивы, даже если не понимаете критериев их создания и внутреннего устройства (собственно, для этой цели стандарты и пишутся: чтобы их мог использовать даже неспециалист). Задумываться о замене или оптимизации стоит только в том случае, когда стандартные примитивы реально не вписываются в формализованные ограничения платформы.

Не хочу обидеть, но Вы мне кажетесь из той категории разработчиков, которые утверждают, что их решение надёжно и безопасно, пока кто-нибудь не докажет (действующим эксплойтом, а лучше не одним) обратного. В мире ИБ принят иной критерий: решение не будет считаться безопасным, пока его автор не убедит остальных, что это действительно так. Способы убеждения достаточно обширны; использование проверенных методик и примитивов — один из них.
— компотFХ (02/06/2009 23:53)   
Я все же слепо руководствуюсь стандартам (по крайней мере стараюсь), хотя мне интерeсно, как все "это работает". Поэтому спрашиваю опытных людей, как Вас на этом форуме.
Mеня гложут сомнения, что иногда ситуации бывают неоднoзначными и слепо руководствоваться стандартами бывает не всегда безопасно или простo избыточно. Kонечно может не в конкретном случае, но вот интерeсный пример из жизни (не имеет никакого отношения к случ. числам): В одной известной мне сoлидной фирме отдел безопасности решил "закрутить гайки потуже" и завел правило – пароль должен быть 12 знaков, цифры, верхний и нижний регистр обязательно, смена паролья каждый месяц, не повтoряются 5 раза. В итоге юзера просто стали лепить бумажки с новыми паролями на монитор, чтоб не забыть :-)

Eсли при строительстве самолета научным путем опрeдeлили, что крыло надо клепать 1000 заклепками это же не значит, что и сидения в салоне надо крeпить таким же количеством. Этo также не значит, что для пущей надежности лучше заклепать крылья 20 000 клепками, так чтобы и при полете (вдруг) на Марс не развалилось. В итоге даже, руководствуясь рeкомендациям цифра в цифру 1000 клепок на крыло, самолет все равно может упасть от сoвсем другой причины..
Насчет стандартов: вчeра sha-1 хорошо, сегодня не очень. Вчера мд5 хорошо, сегодня нашли уязвимость. Вчера встроенный стойкий ГПСЧ хорошо, сегодня оказался нестойкий (дебиан) :-)

Cпасибо вам за дискуссию. Я новичок в этой теме, стопудово неправ и наверное наивeн. Интерeсно было бы почитать литературу более приближенную к жизни: типы аттак, верятности и возможные способы взлома различных типов шифров в различных ситуациях ..итд. За ссылки буду очень признателeн.
— unknown (03/06/2009 09:45, исправлен 03/06/2009 09:46)   
Интерeсно было бы почитать литературу более приближенную к жизни: типы аттак, верятности и возможные способы взлома различных типов шифров в различных ситуациях ..

Если для вас практические стандарты – "сферический конь в вакууме", то то, что вы спрашиваете есть только в сугубо теоретической литературе, которая будет для вас скорее вообще "мегасферическим квазиконём в неевклидовом гиперпространстве" :-)
Гость (03/06/2009 10:05)   
матeматематика наука точная
А криптография – нет. Скорее похожа на ремесло :)
— unknown (03/06/2009 10:57, исправлен 03/06/2009 11:47)   
"О непростых взаимоотношениях между математикой и криптографией"[link3]

А вообще, надо было чётко сформулировать задачу. Создание устройств без качественного ГПСЧ (смарт-карты, ключи и пр.) – известная и нормально до сих пор нерешённая задача. Если бы с самого начала было ясно, что вам нужно именно это, то вам бы не советовали использовать только стойкий ГПСЧ.

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

Эта задача решается в рамках т.н. "Deterministic encryption".
Ранее считалось, что "Any deterministic, stateless sheme is insecure", по крайней мере к атакам с подобранным открытым текстом, но неизвестно во что эти атаки можно развить далее.

Стандарта на "Deterministic encryption" мне неизвестно, но больше всего вам подойдёт работа: "Deterministic and Efficiently Searchable Encryption"[link4] (Mihir Bellare and Alexandra Boldyreva and Adam O'Neill) и исследование Stateless "evaluation of pseudorandom functions: Security beyond the birthday barrier"[link5] (M. Bellare, O. Goldreich and H. Krawczyk).

Только даже если упрощать и адаптировать под свой случай, придётся потрудиться и написать доказательство к работе не хуже, чем у этих высокоуважаемых авторов.
— SATtva (14/06/2009 17:29)   
Минута гугленья, к которой подтолкнула эта[link6] тема, привела к такому вот[link7] документу от CERT, если наше мнение не достаточно.
— RElf (31/08/2009 00:43)   
Хорошим примером использования криптографических слабостей в ГСЧ является атака Mike Stay на шифрование WinZIP:
http://math.ucr.edu/~mike/zipattacks.pdf
Она позволяет (точнее сказать, позволяла – в современных версиях WinZIP проблема устранена) быстро расшифровывать защищенные паролем WinZIP-архивы, коль скоро в них присутствовало несколько файлов.
Причем, в отличие от известной атаки Biham и Kocher на шифрование в ZIP-архивах, она не требовала вообще никакой информации о содержимом зашифрованных файлов. Неудивительно, что эта атака была сразу же взята на вооружение "взламывателями паролей" такими как ElcomSoft Advanced Archive Password Recovery.
— DDRTL (31/08/2009 18:36)   
какие dll в windows отвечают за шифрование т.е такие где есть rand() ?
Гость (31/08/2009 19:31)   
какие dll в windows отвечают за шифрование т.е такие где есть rand() ?

crypt32.dll

http://msdn.microsoft.com/en-u.....aa380255(VS.85).aspx[link8]
Гость (31/08/2009 19:36)   
Детали функции генерации случайных чисел

http://msdn.microsoft.com/en-u.....aa379942(VS.85).aspx[link9]

Среди прочего, утверждается что
In Windows Vista with Service Pack 1 (SP1) and later, an implementation of the AES counter-mode based PRNG specified in NIST Special Publication 800-90 is used. In Windows Vista, Windows Storage Server 2003, and Windows XP, the PRNG specified in Federal Information Processing Standard (FIPS) 186-2 is used.
— DDRTL (01/09/2009 18:45)   
О там есть http://msdn.microsoft.com/en-u.....aa380259(VS.85).aspx[link10] криптографические инструментарии...
Отсюда видим(http://support.microsoft.com/kb/329433)
Date Time Version Size File name

21-Jul-2003 08:27 5.131.2195.6778 532,752 crypt32.dll

С 2003 года не обновлялась библиотека(!!!)...
Было бы интересно узнать как проверить эту библиотеку на рандомизацию, т.е не содержит ли она уязвимости на предугадывание результата...
— SATtva (01/09/2009 18:53)   
Это ГПСЧ. У ГПСЧ есть тестовые векторы, приведённые в руководящих документах NIST.
— DDRTL (01/09/2009 20:51)   
http://csrc.nist.gov/groups/ST.....t/random_number.html[link11] тут эти документы есть?
— SATtva (01/09/2009 21:05, исправлен 01/09/2009 21:07)   
Ну вот же, синим по белому прямо на той странице:
http://csrc.nist.gov/publicati.....evised_March2007.pdf[link12]
http://csrc.nist.gov/publicati.....ips186-2-change1.pdf[link13]
И вот по тестированию:
http://csrc.nist.gov/groups/ST.....ents/drbg/DRBGVS.pdf[link14]
— Мухтар (08/10/2009 14:13)   
Распределение ГСЧ может быть 0.5, или такое, какое захотите. Распределение абсолютно случайных данных вообще никакими статистическими методами не коррелируется. Может быть хотя пара гигабайт нулей. Отсюда можно сделать выводы:
1) Короткая длины гсч последовательности имеет гораздо меньшую сложность брутфорса, чем та, которая обусловлена количеством бит
2) Возможны теоретические атаки на корреляцию распределения гсч и данных вслучае шифрования одноразовым блокнотом.
— unknown (08/10/2009 15:42, исправлен 08/10/2009 15:44)   
Распределение ГСЧ может быть 0.5, или такое, какое захотите. Распределение абсолютно случайных данных вообще никакими статистическими методами не коррелируется.

Погрешность измерения распределений обратна пропорциональна их количеству. Для ограниченного числа измерений строят доверительные интервалы. Для теоретических расчётов используют идеальную модель с бесконечным числом измерений, так что доверительные интервалы в пределе стремятся к нулю, распределение — к истинному значению.


Молекулы воздуха тоже могут случайно собраться в одном углу комнаты.
Отсюда можно сделать выводы, что:
1) вы задохнётесь от нехватки воздуха
2) в том углу самопроизвольно повысится температура и произойдёт самовозгорание.

Ну и какова расчётная вероятность таких событий?
Гость (08/10/2009 15:51)   
Может быть хотя пара гигабайт нулей.
Но очень редко :)
Отсюда можно сделать выводы: 2)
Нельзя.
— Мухтар (08/10/2009 15:52)   
Unknown:
И поэтому рассчет вероятности атаки на симметричные шифры должен учитывать модель угрозы из-за несоответствия сложности атаки не кифер и атаки на кифер исходя из распределения ключа при использовании конкретного гсч. Так что 256 бит может оказаться не панацеей даже без использования квантового ускорителя.

Ссылки
[link1] https://www.pgpru.com/comment30538

[link2] https://www.pgpru.com/comment30524

[link3] https://www.pgpru.com/biblioteka/statji/koblitcmatematikikriptografy

[link4] http://eprint.iacr.org/2006/186

[link5] http://www-cse.ucsd.edu/users/mihir/papers/otp.html

[link6] https://www.pgpru.com/forum/prakticheskajabezopasnostj/randmozhnolipredugadatj

[link7] https://www.securecoding.cert.org/confluence/display/seccode/MSC30-C.+Do+not+use+the+rand()+function+for+generating+pseudorandom+numbers

[link8] http://msdn.microsoft.com/en-us/library/aa380255(VS.85).aspx

[link9] http://msdn.microsoft.com/en-us/library/aa379942(VS.85).aspx

[link10] http://msdn.microsoft.com/en-us/library/aa380259(VS.85).aspx

[link11] http://csrc.nist.gov/groups/ST/toolkit/random_number.html

[link12] http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf

[link13] http://csrc.nist.gov/publications/fips/archive/fips186-2/fips186-2-change1.pdf

[link14] http://csrc.nist.gov/groups/STM/cavp/documents/drbg/DRBGVS.pdf