Каковы плюсы и минусы использования System.Security.Cryptography.RNGCryptoServiceProvider по сравнению с System.Random. Я знаю, что RNGCryptoServiceProvider более случайный, т.е. менее предсказуемый для хакеров. Есть ли другие плюсы или минусы?
Обновлено:
Согласно ответам, вот плюсы и минусы использования RNGCryptoServiceProvider на данный момент:
RNGCryptoServiceProvider - более сильное криптографически случайное число, что означает, что его лучше использовать для определения ключей шифрования и т.п.Random быстрее, потому что это более простой расчет; при использовании в симуляциях или длительных вычислениях, где криптографическая случайность не важна, это следует использовать. Примечание: см. Ответ Кевина для получения подробной информации о моделировании - Random не обязательно достаточно случайный, и вы можете захотеть использовать другой не криптографический PRNG.




Криптографически стойкий ГСЧ будет медленнее - для этого потребуется больше вычислений - и будет спектрально белым, но он не будет так хорошо подходить для моделирования или методов Монте-Карло, потому что они делать занимают больше времени, и потому что они могут не будет повторяться, что приятно для тестирования.
В общем, вы хотите использовать криптографический PRNG, когда вам нужен уникальный номер, такой как UUID, или в качестве ключа для шифрования, и детерминированный PRNG для скорости и моделирования.
При повторном тестировании вы всегда можете использовать Random во время тестирования и изменить реализацию, чтобы использовать RNGCryptoServiceProvider в производстве, не так ли?
Можно, но сильный ГПСЧ все равно не подходит для некоторых целей, таких как Монте-Карло; повторяемость и скорость также желательны при производственном использовании.
Что вы имеете в виду под «спектрально-белым»?
Как белый шум. Спектр мощности плоский, и нет более вероятных групп чисел, чем другие. См. en.wikipedia.org/wiki/White_noise и en.wikipedia.org/wiki/Power_spectral_de density По сути, это сильный тест для действительно случайных чисел.
@CharlieMartin "Спектр мощности плоский, и нет более вероятных групп чисел". Разве тот факт, что спектр плоский, не означает, что некоторые группы чисел находятся с большей вероятностью появятся? В RNGCryptoServiceProvider каждый бит имеет примерно 50% шанс быть установленным, это означает, что числа с примерно половиной их установленных битов будут самыми популярными, а числа с установленным только несколькими битами (или значениями со всеми установленными битами) будут маловероятно.
Ох, хороший вопрос. Учтите: 001100 имеет такое же количество битов, как и 110000. И посмотрите это: en.wikipedia.org/wiki/Statistical_randomness
Да, есть еще один. Как писал Чарли Мартин, System.Random быстрее.
Хочу добавить следующую информацию:
RNGCryptoServiceProvider - это стандартная реализация генератора случайных чисел, совместимого со стандартами безопасности. Если вам нужна случайная переменная в целях безопасности, вы должны использовать этот класс или его эквивалент, но не используйте System.Random, потому что он очень предсказуем.
Для всех других целей приветствуется более высокая производительность System.Random и аналогичных классов.
Могу ли я использовать rngcryptoserviceprovider в качестве токена аутентификации для webapi, используемого различными приложениями.
System.Random не является потокобезопасным.
Хорошая точка зрения. Вы можете увидеть blogs.msdn.com/pfxteam/archive/2009/02/19/9434171.aspx для дальнейшего обсуждения.
Теперь, когда я думаю об этом, RNGCryptoServiceProvider тоже не такой!
MSDN, похоже, говорит, что RNGCryptoServiceProvider является потокобезопасным (msdn.microsoft.com/en-us/library/…).
Помимо шуток, он может испортить себя и вернуть нули (stackoverflow.com/a/11109361/155892). (dilbert.com/strips/comic/2001-10-25)
В дополнение к предыдущим ответам:
System.Random следует использовать в моделировании или численных решателях для науки и техники, где есть существенные негативные последствия неточных результатов моделирования или сбоя сходимости. Это связано с тем, что реализация Microsoft - глубоко ошибочный в нескольких отношениях, и они не могут (или не будут) легко исправить это из-за проблем совместимости. См. эта почта.
Так:
Если есть противник, который не должен знать сгенерированную последовательность, затем используйте RNGCryptoServiceProvider или другой тщательно разработанный, реализованный и проверенный криптографически стойкий RNG, а в идеале используйте аппаратную случайность, где это возможно. Иначе;
Если это приложение, такое как моделирование, которое требует хороших статистических свойств, затем используйте тщательно разработанный и реализованный некриптографический PRNG, такой как Мерсенн Твистер. (В этих случаях криптографический ГСЧ также будет верный, но часто слишком медленным и громоздким.) Иначе;
ТОЛЬКО, если использование чисел совершенно тривиально, например, решение, какое изображение показывать следующим в случайном слайд-шоу, затем использовать System.Random.
Недавно я очень ощутимо столкнулся с этой проблемой, когда работал над симуляцией Монте-Карло, предназначенной для проверки эффектов различных схем использования медицинских устройств. Моделирование дало результаты, которые находятся в пределах противоположное направление, которые можно было бы разумно ожидать.
Sometimes when you canʼt explain something, thereʼs a reason behind it, and that reason could be very onerous!
Вот график значений п ‑, которые были получены в увеличивающемся количестве пакетов моделирования:
Красный и пурпурный графики показывают статистическую значимость различий между двумя моделями использования в двух исследуемых выходных показателях.
Голубой график представляет собой особенно шокирующий результат, потому что он представляет значения п ‑ для характеристики случайного Вход для моделирования. (Это было нанесено на график только для подтверждения того, что входные данные не были ошибочными.) Входные данные, конечно, были изначально одинаковыми для двух исследуемых моделей использования, поэтому не должно быть статистически значимой разницы между Вход для этих двух моделей. . И все же здесь я видел более чем 99.97% уверенность, что есть было такая разница !!
Сначала я подумал, что в моем коде что-то не так, но все проверило. (В частности, я подтвердил, что потоки не совместно используют экземпляры System.Random.) Когда повторное тестирование показало, что этот неожиданный результат очень согласован, я начал подозревать System.Random.
Я заменил System.Random реализацией Mersenne Twister - никаких других изменений - и сразу же результат стал кардинально другим, как показано здесь:
Эта диаграмма отражает отсутствие статистически значимой разницы между двумя моделями использования параметров, используемых в этом конкретном наборе тестов. Это был ожидаемый результат.
Обратите внимание, что на первой диаграмме вертикальная логарифмическая шкала (по значению п ‑) охватывает семь десятилетий, тогда как во второй есть только одна декада, демонстрируя, насколько выражена статистическая значимость ложных расхождений! (Вертикальная шкала указывает вероятность того, что расхождения могли возникнуть случайно.)
Я подозреваю, что происходило то, что System.Random имеет некоторые корреляции в течение некоторого довольно короткого цикла генератора, и разные шаблоны внутренней выборки случайности между двумя тестируемыми моделями (которые имели существенно разное количество обращений к Random.Next) привели к тому, что это повлияло на две модели в различные способы.
Так получилось, что моделирование Вход основано на тех же потоках ГСЧ, которые используются в моделях для внутренних решений, и это, очевидно, привело к тому, что эти несоответствия выборки повлияли на входные данные. (На самом деле это было удачей, потому что в противном случае я, возможно, не понял бы, что неожиданный результат был ошибкой программного обеспечения, а не каким-то реальным свойством моделируемых устройств!)
Интересно. Я не знал о статистических различиях. Спасибо!
например Блюм Блюм Шуб vs Мерсенн Твистер. BBS создается с учетом надежных криптографических доказательств, и для того, чтобы получить хоть какое-то значение, близкое к случайному для не криптографических целей, это слишком медленно и ресурсоемко.