암호학적으로 안전한 PRNG
/dev/urandom, ChaCha20-CSPRNG, Fortuna를 살펴봅니다.
암호학적으로 안전한 PRNG은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
CSPRNG 요구 사항 복습
CSPRNG는 다음 조건을 충족해야 합니다. (1) 다음 비트 예측 불가능성: 이전의 모든 비트를 알아도 다음 비트를 1/2 + 무시할 수 있을 정도로 작은 값보다 높은 확률로 예측할 수 없어야 합니다. (2) 상태 손상 확장 저항성: 현재 상태를 알아도 과거 출력에 관한 정보가 드러나지 않아야 합니다.
/dev/urandom 및 getrandom()
리눅스의 /dev/urandom은 엔트로피 풀에서 시드를 받은 CSPRNG을 사용합니다. 초기 시드 설정(128비트 엔트로피)이 완료되면 풀이 "비어" 있는 경우에도 안전하게 사용할 수 있습니다. CSPRNG이 자체 내부 상태를 유지하기 때문입니다. getrandom()은 이에 해당하는 최신 시스템 호출입니다.
ChaCha20 기반 CSPRNG
리눅스 커널 5.17 이상에서는 CSPRNG을 ChaCha20 기반 설계로 교체했습니다. ChaCha20은 빠르고(하드웨어 가속이 필요하지 않음), 256비트 보안을 제공하며, 보안 증명이 잘 정립되어 있습니다. 논스는 카운터이고 키는 엔트로피 풀에서 가져옵니다.
Fortuna
Fortuna(Ferguson & Schneier, 2003)는 32개의 엔트로피 풀을 유지하고 엔트로피를 지속적으로 축적하는 CSPRNG 설계입니다. 풀이 채워지면 해당 풀에서 생성기를 재시드합니다. RNG 재설정 공격과 상태 일부 노출 공격에 강합니다.
DUAL_EC_DRBG 백도어
NIST SP 800-90A에는 원래 타원 곡선을 기반으로 하는 DUAL_EC_DRBG가 포함되어 있었습니다. Snowden 문서에서 NSA가 백도어를 삽입한 사실이 드러났습니다. EC 점을 NSA가 어떤 시드에서든 출력을 예측할 수 있도록 선택했던 것입니다. DUAL_EC_DRBG는 절대 사용하지 마십시오. NIST는 2014년에 이를 제거했습니다.
CTR_DRBG
CTR_DRBG(NIST SP 800-90A)는 카운터 모드의 AES를 CSPRNG으로 사용합니다. 시드 = 256비트 키 + 128비트 논스입니다. 호출할 때마다 카운터가 증가합니다. OpenSSL, BoringSSL, Windows BCrypt에 널리 구현되어 있습니다. AES-NI CPU에서는 하드웨어 가속이 지원됩니다.
HASH_DRBG 및 HMAC_DRBG
HASH_DRBG는 시드 값을 해시 함수(SHA-256)에 반복적으로 적용합니다. HMAC_DRBG는 혼합에 HMAC을 사용합니다. HMAC_DRBG는 올바르게 구현하기 더 간단하며 여러 임베디드 시스템(mbedTLS, WolfSSL)에서 사용됩니다.
재시드 및 엔트로피 주입
CSPRNG도 주기적으로 재시드해야 합니다. CTR_DRBG의 재시드 간격은 2^48회 요청입니다. Fortuna는 엔트로피 풀에서 재시드합니다. 수동 재시드 방법은 시작 시와 fork() 이후에 새로운 엔트로피(getrandom 바이트)를 CSPRNG 상태에 추가하는 것입니다.
포크 문제
프로세스가 포크되면 부모와 자식이 동일한 CSPRNG 상태를 상속하므로 동일한 출력을 생성합니다. 해결 방법은 fork() 직후 getrandom()을 호출하여 즉시 재시드하는 것입니다. 최신 버전의 OpenSSL은 pthread_atfork()를 통해 이 작업을 자동으로 처리합니다.
실전에서의 CSPRNG: Python
import secrets key = secrets.token_bytes(32) # 256-bit key nonce = secrets.token_bytes(12) # 96-bit nonce for AES-GCM pin = secrets.randbelow(10**6) # 6-digit PIN # Never use random module for cryptography
브라우저 암호화
window.crypto.getRandomValues(typedArray)는 브라우저의 CSPRNG입니다. OS의 엔트로피 소스를 호출합니다. 키 생성에는 WebCrypto API가 사용됩니다. 보안 목적으로 Math.random()을 절대 사용하지 마십시오. Math.random()은 암호학적으로 안전하지 않은 PRNG이며 시스템 시간에서 시드를 받습니다.
빠른 확인
암호학적으로 안전한 무작위 바이트를 생성하려면 어떤 Python 모듈을 사용해야 합니까?
복습
ChaCha20, CTR_DRBG, Fortuna와 같은 CSPRNG은 엔트로피 시드에서 예측할 수 없는 출력을 생성합니다. DUAL_EC_DRBG, random.random(), Math.random()은 피하십시오. Python에서는 secrets를, 브라우저에서는 window.crypto를 사용하십시오. 다음 주제: 실제 환경의 엔트로피 실패 사례입니다.
자주 묻는 질문
“암호학적으로 안전한 PRNG” 강의는 무료인가요?
네 — “암호학적으로 안전한 PRNG” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“암호학적으로 안전한 PRNG”에서 뭘 배우나요?
/dev/urandom, ChaCha20-CSPRNG, Fortuna를 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“암호학적으로 안전한 PRNG” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 진정한 무작위성과 의사 난수성
- 암호학적으로 안전한 PRNG
- 엔트로피 고갈과 취약한 키 버그
- 키, 논스 및 IV를 안전하게 생성하기