mt19937 PRNG를 강력하게 시드하는 방법
일반적으로 제안되는 것과 달리 std::random_device를 사용하여 mt19937 PRNG를 시드하는 것은 다음과 같은 많은 단점이 있습니다. 엔트로피가 부족하고 불균일 가능성이 있습니다. 이 문서에서는 이러한 문제를 극복하는 솔루션을 제시합니다.
이동 가능하고 철저한 시딩
다음 접근 방식은 플랫폼별 암호화 강도 임의 바이트 소스(sysrandom)를 활용합니다. PRNG를 시드하려면:
std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed);
sysrandom은 임의의 바이트를 검색하는 래퍼 함수입니다. 플랫폼에 따라 적합한 소스:
Windows:
유닉스 계열:
기타:
암호화 품질 소스에서 이 솔루션은 충분한 엔트로피와 철저한 보장을 보장합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!