>백엔드 개발 >C++ >더 나은 난수 생성을 위해 mt19937 PRNG를 강력하게 시드하는 방법은 무엇입니까?

더 나은 난수 생성을 위해 mt19937 PRNG를 강력하게 시드하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-02 12:05:18503검색

How to Robustly Seed the mt19937 PRNG for Better Random Number Generation?

mt19937 PRNG를 강력하게 시드하는 방법

일반적으로 제안되는 것과 달리 std::random_device를 사용하여 mt19937 PRNG를 시드하는 것은 다음과 같은 많은 단점이 있습니다. 엔트로피가 부족하고 불균일 가능성이 있습니다. 이 문서에서는 이러한 문제를 극복하는 솔루션을 제시합니다.

이동 가능하고 철저한 시딩

다음 접근 방식은 플랫폼별 암호화 강도 임의 바이트 소스(sysrandom)를 활용합니다. PRNG를 시드하려면:

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

sysrandom은 임의의 바이트를 검색하는 래퍼 함수입니다. 플랫폼에 따라 적합한 소스:

Windows:

  • CryptGenRandom(제공자: PROV_RSA_FULL)

유닉스 계열:

  • /dev/urandom(대체: std::random_device if 사용할 수 없음)

기타:

  • std::random_device(가능하면 피하는 것이 좋습니다)

암호화 품질 소스에서 이 솔루션은 충분한 엔트로피와 철저한 보장을 보장합니다.

Boost와의 비교

Boost의 Random_device는 유사한 기술(예: Windows의 MS_DEF_PROV, *Nix의 /dev/urandom)을 사용하므로 제시된 접근 방식을 다음과 비교할 수 있습니다. 이식성과 품질.

Linux 전문화

Linux 3.17의 보안을 강화하려면 /dev/urandom 대신 getrandom(CSPRNG가 초기화되지 않은 경우 차단)을 사용할 수 있습니다:

#if defined(__linux__)...
size_t sysrandom(void* dst, size_t dstlen)
{
    int bytes = syscall(SYS_getrandom, dst, dstlen, 0);
    if (bytes != dstlen) { throw std::runtime_error(...); }
    return dstlen;
}
#elif defined(_WIN32)...
#else...
#endif

OpenBSD 주의사항

최신 OpenBSD에는 부족함 /dev/urandom. 대신 getentropy를 활용하세요:

#if defined(__OpenBSD__)...
size_t sysrandom(void* dst, size_t dstlen)
{
    int bytes = getentropy(dst, dstlen);
    if (bytes != dstlen) { throw std::runtime_error(...); }
    return dstlen;
}
#endif

위 내용은 더 나은 난수 생성을 위해 mt19937 PRNG를 강력하게 시드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.