Я просматривал страницу библиотеки Crypto++ ГСЧ и мне было интересно, есть ли проблемы с использованием чего-то вроде
std::srand(std::time(nullptr)); //using the current time as seed
по сравнению с одним из rng в криптобиблиотеке?
Я новичок в криптографии, но одним из возможных аргументов может быть то, что функции криптографического кольца устойчивы к коллизиям? Однако я не уверен, насколько они лучше/сильнее в количественном отношении.
std::srand
также не является генератором случайных чисел. Вы спрашиваете о std::rand()
?
В зависимости от вашей платформы RAND_MAX
может быть всего 32767.
std::srand()
и std::rand()
не обязаны соответствовать каким-либо особым требованиям к случайности, не говоря уже о криптографии. И последовательность предсказуема, если вы знаете (или можете угадать семя). Хотя у них есть свое применение (проще в использовании, чем генераторы более высокого качества, и не каждое приложение требует генератора высокого качества), они обычно не будут использоваться для удовлетворения криптографических требований (если только у вас нет требования «легко взломать» или «легко расшифровать» ).
Извините за путаницу, но да, я спрашивал о std::rand
, но я также узнал кое-что о srand, так что спасибо :)
@Peter — «высокое качество» зависит от ваших требований. Для моделирования важна скорость, а безопасность — нет. Криптографически безопасные генераторы случайных чисел имеют низкое качество в этой среде, потому что они слишком медленные.
@PeteBecker Согласен. Мой предыдущий комментарий был посвящен качеству с точки зрения свойств набора сгенерированных случайных значений, поскольку OP ссылается на криптографию (которая связана с мерами безопасности). Но вы правы, указывая на то, что разные приложения используют разные меры качества.
Сопротивление столкновениям не имеет большого значения для ГСЧ. Если вы ожидаете случайный вывод, он не должен конфликтовать, когда вы получаете достаточно данных. Большая проблема заключается в том, что если вы доберетесь до (начального) состояния, вы сможете предсказать все следующие значения. Обычно такие функции, как rand
, просто имеют достаточно маленькое состояние, чтобы вы могли даже переборщить с ним, хотя обычно вы должны иметь возможность добраться до состояния намного быстрее (например, угадывая начальное число или реверсируя алгоритм).
Некриптографические «случайные» источники не подходят для криптографических целей, потому что, хотя они могут давать значения, которые действительно отличаются, значения могут по крайней мере...
size_t
, а затем нацелены на 16- или 32-битный микроконтроллер)Это огромная разница.
Существует четыре класса «случайных» чисел, классифицируемых по пересечению двух основных свойств:
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]
Генераторы случайных чисел oseudo# в стандартной библиотеке не предназначены для криптографической защиты. Они предназначены для симуляций и подобных вещей.