Допустимо ли использовать rand () для криптографически небезопасных случайных чисел? - PullRequest
3 голосов
/ 23 сентября 2019

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

Конечно, я предполагаю, что применяются обычные предостережения о перекосе .

Ответы [ 4 ]

5 голосов
/ 23 сентября 2019

rand() страдает некоторыми серьезными недостатками.

  1. Нет гарантии качества случайного числа.Это будет варьироваться от реализации к реализации.
  2. Общее состояние, используемое различными вызовами rand, не гарантируется поточно-ориентированным.

Что касается альтернатив POSIX C, то есть random и random_r.OpenSSL предоставляет более продвинутые способы генерации случайных чисел.

Библиотека C ++ (C ++ 11 и новее) также предоставляет ряд функций для работы со случайными числами, если опция C ++ в вашем проекте является опцией.

3 голосов
/ 23 сентября 2019

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

*Плохие свойства 1005 * во многих системах включают в себя:

  • неслучайность в младших битах (таких, что, например, rand()%2 гарантированно чередуется 0,1,0,1 ...).
  • относительно короткий период, возможно, «всего» 4 миллиарда или около того

Поэтому мой (неохотно) совет такой: если вам нужна «хорошая» случайность (скажем, для симуляции Монте-Карло)), вы вполне можете захотеть исследовать, используя нестандартную альтернативу rand().(Один из моих вечных вопросов о C заключается в том, почему любой поставщик тратит время на развертывание нестандартного random() вместо простого улучшения rand(). И я знаю канонические ответы, хотя они отстой.)

См.также этот похожий вопрос .

2 голосов
/ 23 сентября 2019

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

1 голос
/ 23 сентября 2019

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

Однако для более серьезного использования случайных чисел, таких как научное моделирование, я отсылаю вас к другому моему ответу , где я объясняю, что проблема с rand /srand означает, что rand -

  • использует неуказанный алгоритм RNG, однако
  • позволяет инициализировать RNG с srand для повторяемой "случайности".

Эти два момента, взятые вместе, затрудняют способность реализаций улучшать реализацию ГСЧ;изменение того факта, что RNG не позволит достичь повторяющейся «случайности», особенно если приложение обновляет до более поздней версии библиотеки времени выполнения C того же поставщика или скомпилировано с реализациями библиотеки различными поставщиками.Первый пункт также означает, что никакое конкретное качество случайных чисел не гарантируется.Другая проблема состоит в том, что srand допускает только относительно небольшие начальные числа - на практике не более 32 бит.

Однако, даже если приложение не заботится о повторяемой "случайности", тот факт, что randуказывает, что он ведет себя по умолчанию так, как если бы srand(1) вызывался (и, таким образом, на практике генерирует ту же «случайную» последовательность по умолчанию), что делает использование rand более трудным для использования, чем могло бы быть.

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

  • , которая использует автономные PRNG, которые поддерживают свое собственное состояние (например, в одном struct) и не затрагивают глобальныесостояние и
  • , который реализует алгоритм PRNG, детали которого известны приложению.

Я перечисляю несколько примеров высококачественных алгоритмов PRNG для некриптографического случайногочисло.

...