ホームページ > バックエンド開発 > C++ > 安全な乱数生成のために C で MT19937 PRNG を適切にシードするにはどうすればよいですか?

安全な乱数生成のために C で MT19937 PRNG を適切にシードするにはどうすればよいですか?

DDD
リリース: 2024-11-29 01:11:11
オリジナル
679 人が閲覧しました

How Can I Properly Seed the MT19937 PRNG in C   for Secure Random Number Generation?

C で MT19937 PRNG を完全にシードする方法

通常、次のように std::random_device は乱数を生成するために使用されます。以下のコード:

std::random_device rd;  
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);
ログイン後にコピー

ただし、このメソッドは

  • std::random_device() が不十分なエントロピーを返します。
  • std::mt19937 gen(rd());gen() は適切な出力分布を生成しない可能性があります。 .
  • std::random_device は、固定の PRNG として実装できます。シード.

より信頼性の高いアプローチは、Windows の CryptGenRandom や Unix 系システムの /dev/urandom などの CSPRNG を使用して、PRNG をシードする高品質のランダム バイトを生成することです。例:

#include <bit>
#include <iostream>
#include <string>

size_t sysrandom(void* dst, size_t dstlen) {
    std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in);
    stream.read((char*)dst, dstlen);
    return dstlen;
}

int main() {
    std::uint_least32_t seed;
    sysrandom(&seed, sizeof(seed));
    std::mt19937 gen(seed);

    // Your code to use the generator here...
    return 0;
}
ログイン後にコピー

このコードは、/dev/urandom を CSPRNG として使用し、32 ビット値を使用して PRNG をシードします。セキュリティを強化するには、この値を増やす必要があります。このアプローチは移植可能で、十分にテストされており、使いやすく、C で乱数を生成するための強固な基盤を提供します。

以上が安全な乱数生成のために C で MT19937 PRNG を適切にシードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート