Есть ли существенная разница между использованием встроенного генератора случайных чисел и использованием криптографического генератора случайных чисел?

Я просматривал страницу библиотеки Crypto++ ГСЧ и мне было интересно, есть ли проблемы с использованием чего-то вроде

 std::srand(std::time(nullptr)); //using the current time as seed 

по сравнению с одним из rng в криптобиблиотеке?

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

Генераторы случайных чисел oseudo# в стандартной библиотеке не предназначены для криптографической защиты. Они предназначены для симуляций и подобных вещей.

Pete Becker 16.02.2023 02:36
std::srand также не является генератором случайных чисел. Вы спрашиваете о std::rand()?
Drew Dormann 16.02.2023 02:38

В зависимости от вашей платформы RAND_MAX может быть всего 32767.

Retired Ninja 16.02.2023 02:51
std::srand() и std::rand() не обязаны соответствовать каким-либо особым требованиям к случайности, не говоря уже о криптографии. И последовательность предсказуема, если вы знаете (или можете угадать семя). Хотя у них есть свое применение (проще в использовании, чем генераторы более высокого качества, и не каждое приложение требует генератора высокого качества), они обычно не будут использоваться для удовлетворения криптографических требований (если только у вас нет требования «легко взломать» или «легко расшифровать» ).
Peter 16.02.2023 03:31

Извините за путаницу, но да, я спрашивал о std::rand, но я также узнал кое-что о srand, так что спасибо :)

Riperoni 16.02.2023 03:37

@Peter — «высокое качество» зависит от ваших требований. Для моделирования важна скорость, а безопасность — нет. Криптографически безопасные генераторы случайных чисел имеют низкое качество в этой среде, потому что они слишком медленные.

Pete Becker 16.02.2023 04:03

@PeteBecker Согласен. Мой предыдущий комментарий был посвящен качеству с точки зрения свойств набора сгенерированных случайных значений, поскольку OP ссылается на криптографию (которая связана с мерами безопасности). Но вы правы, указывая на то, что разные приложения используют разные меры качества.

Peter 16.02.2023 11:41

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

Maarten Bodewes 17.02.2023 03:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Некриптографические «случайные» источники не подходят для криптографических целей, потому что, хотя они могут давать значения, которые действительно отличаются, значения могут по крайней мере...

  • возможно, иметь предсказуемое начальное число (часто время - прогнозирование запуска программы может сократить реальную энтропию до нескольких порядков значений)
  • возможно, полагаться на другую низкую энтропию системы (рассмотрите клонированную виртуальную машину между запусками)
  • вести себя плохо или быть логически менее сложным в разных средах (возможно, они используют size_t, а затем нацелены на 16- или 32-битный микроконтроллер)
  • происходят из довольно ограниченного пула (для крайнего случая см. DOOM m_random.c)
  • даже если пул велик, подмножества результатов может быть достаточно для прогнозирования предстоящих значений, если порядок всегда одинаков.
  • не производиться за постоянное время (потенциально утечка информации о внутреннем состоянии)

Да

Это огромная разница.


Существует четыре класса «случайных» чисел, классифицируемых по пересечению двух основных свойств:

         insecure                secure
   ┌──────────────────┐   ┌──────────────────┐
 p │       PRNG       │   │      CSPRNG      │
 s ├──────────────────┤   ├──────────────────┤
 e │      rand()      │   │                  │
 u │       LCG        │   │   /dev/urandom   │
 d │ Mersenne Twister │ ← │   MS CryptoAPI   │
 o │    XOR Shift     │   │  (and many more) │
   │       etc        │   │                  │
   └──────────────────┘   └──────────────────┘
                                   ↑
   ┌──────────────────┐   ┌──────────────────┐
   │       TRNG       │   │      STRNG       │
 t ├──────────────────┤   ├──────────────────┤
 r │  Noise Sampling  │   │  (a TRNG that    │
 u │ Radioactive Decay│   │     has been     │
 e │ Lightning Strikes│ → │   unbiased, or   │
   │ Double Pendulums │   │    “whitened” )  │
   │       etc        │   │                  │
   └──────────────────┘   └──────────────────┘

Псевдослучайные числа — это то, о чем люди склонны думать, когда мы говорим «библиотека случайных чисел».

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

Однако все, что связано с безопасностью или криптографией, должно исходить от безопасной стороны. Поскольку можно исчерпать STRNG, мы используем CSPRNG практически для всего. CSPRNGS не менее безопасны, чем STRNG.

The arrows in the above diagram show the direction of travel for things like initialization and entropy renewal — something you probably don’t have to care about.


Стандартная библиотека C++, за одним (возможным) исключением, представляет собой небезопасные PRNG.

Единственный CSPRNG в стандартной библиотеке (вероятно) — это std::random_device, и это отстой. (Его различные реализации значительно улучшились с момента его появления, но это все еще действительно ужасная вещь. Я так ее ненавижу, что даже написал небольшую библиотеку, чтобы заменить ее в 2017 году: https://github.com/Duthomhas/ CSPRNG )

Однако, если вы работаете с конкретным криптографическим API, придерживайтесь его. Возможно, он не особенно дружелюбен к C++, но предоставляет превосходные средства для того, что вы собираетесь с ним делать.

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

[1]

Другие вопросы по теме

Похожие вопросы

Вставить по порядку ряд битов в байт (u_int8_t)
С++: нужен ли виртуальный деструктор для объектов, выделенных в стеке?
Имеет ли GCC11 регрессию, в которой он неправильно принимает указатель на массив абстрактного класса
Явное создание объектов с помощью тривиального конструктора по умолчанию с использованием нового размещения в C++17
Каков наиболее ресурсоэффективный способ проверить, содержат ли два списка std::list одинаковые уникальные элементы?
С++: получение случайных символов в качестве вывода, не знаю, почему
Unordered_map из собственного типа путем перегрузки оператора() не работает
Измерение вертикального расстояния бинаризованного изображения (Open CV) C++
Можно ли автоматически сопоставлять и перенаправлять типы в контексте структуры на параметры функции с помощью шаблонов C++?
Программа для поиска абсолютных псевдопростых чисел Эйлера