빠르고 암호화적으로 강력한 PRNG를 위해 /dev/urandom 사용

빠르고 암호화적으로 강력한 PRNG를 위해 /dev/urandom 사용

편집하다질문을 더 구체적으로 만들려면:
프로그램이 /dev/urandom클라우드의 Ubuntu LTS VM에서 최소 1MB/초의 속도로 암호화가 강력한 고품질 난수를 읽을 수 있습니까? 아니면 고려해야 할 함정이 있습니까?

원래:

여러 조건을 충족하면서 난수를 제공하는 구성 요소를 작성해야 합니다.

  1. 통계적으로 독립적이고 선형적으로 분포된 숫자를 생성하고 업계 표준 통계 무작위성 테스트를 통과해야 합니다.
  2. 알고리즘은 "암호적으로 강력하다"고 간주되어야 합니다.
  3. 충분히 빨라야 합니다.
  4. 대상 시스템은 클라우드에 가상화된 Ubuntu LTS입니다.

/dev/urandom실제 (하드웨어) RNG(예 :이것) 또는 CSPRNG 코드를 작성하세요. 내가 수집한 정보(아래 참조)에 따르면 이것이 유효한 접근 방식인 것 같지만 누락된 내용이 없는지 확인하고 싶습니다.

  • ~에 따르면Linux 난수 생성기의 문서화 및 분석섹션 8.2:
    테스트 결과 /dev/random 및 dev/urandom에 대해 난수를 생성하는 출력 함수가 이상적인 난수 생성기의 특성을 나타내는 데이터를 생성하는 것으로 나타났습니다. 따라서 난수의 엔트로피를 줄이는 구현 오류는 발견되지 않았습니다.
    이는 첫 번째 요구 사항을 충족하는 것으로 보입니다.

  • Wikipedia에 인용된 정보에 따르면 Linux 커널은 다음을 사용합니다.정확히 20데이터를 생성하는 알고리즘은 /dev/urandom다음에서 시작됩니다.버전 4.8. 이 알고리즘은 일반적으로 "암호적으로 안전한" 것으로 간주됩니다.
    이는 두 번째 요구 사항을 충족하는 것으로 보입니다.

  • 사용 가능한 Ubuntu 시스템이 없지만 { timeout --foreground 1s cat /dev/urandom; } | wc -cM1 Mac에서 실행하고 있는데 약 200MB/s로 보고되는데 이는 내 요구 사항에 충분히 빠릅니다. 동일하게 실행온라인2.5배 더 빨라졌습니다.
    작은 C++ 프로그램은 read()40KB 버퍼를 반복적으로 채우기 위해 낮은 수준의 호출을 사용하여 /dev/urandom약 1GB/s의 속도를 달성했습니다 . getrandom()Mac에서는 테스트 할 수 없었지만 Gotbolt로 빠르게 확인해 보면 두 방법 모두 동일한 버퍼 크기에 대해 거의 동일한 성능을 발휘하는 것으로 나타났습니다.
    이는 세 번째 요구 사항을 충족하는 것으로 보입니다.

  • 이것기사이는 속도 향상이 커널 버전 5.17(및 5.18의 추가 개선)에서 이루어졌음을 나타냅니다. 이는 이미 Ubuntu 22.04.2LTS(커널 버전 5.19 사용)에 있음을 의미합니다.

제가 놓친 주의사항이 있나요?

관련 정보