# 암호학적 난수 생성기 (Cryptographic Random Number Generator, CRNG)

암호학적 난수 생성기(cryptographic random number generator, CRNG 또는 CSPRNG)는 암호 용도로 쓸 수 있을 만큼 예측 불가능한 난수를 만드는 생성기입니다. 단순히 통계 검정을 통과하는 것을 넘어, 공격자가 지금까지의 출력을 모두 보더라도 다음 비트를 1/2보다 의미 있게 높은 확률로 맞힐 수 없어야 합니다(다음 비트 예측 불가능성). 스트림 암호의 키스트림(혼돈 수열) 생성기로도 쓸 수 있습니다.

## 자세히 알아보기

실제 CRNG는 보통 두 부분으로 이뤄집니다. ① 하드웨어 잡음, 인터럽트 타이밍 등에서 엔트로피를 모으는 엔트로피 원, ② 모은 엔트로피를 시드로 삼아 해시·블록 암호·스트림 암호로 대량의 출력을 만드는 결정론적 난수 비트 생성기(DRBG)입니다. NIST SP 800-90A는 Hash_DRBG, HMAC_DRBG, CTR_DRBG를 규정하며, 백도어 의혹이 있던 Dual_EC_DRBG는 2014년 권고에서 철회되어 개정판에서 제거되었습니다. 엔트로피 원 평가는 SP 800-90B가 다룹니다.

좋은 CRNG는 내부 상태가 노출되어도 과거 출력을 되돌려 계산할 수 없어야 하고(역추적 저항성, backtracking resistance), 새 엔트로피를 주기적으로 섞어 상태 노출 이후의 미래 출력도 다시 안전해져야 합니다(예측 저항성). 응용 프로그램은 직접 만들기보다 운영체제가 제공하는 생성기(리눅스 getrandom()·/dev/urandom, 윈도우 BCryptGenRandom, 브라우저 crypto.getRandomValues)를 쓰는 것이 모범 사례입니다. 반면 메르센 트위스터나 언어 기본 random() 같은 일반 의사난수 생성기는 빠르지만 출력으로 내부 상태가 복원되므로 암호용으로 쓰면 안 됩니다. 또한 CRNG는 일회용 패드용 '진정한 난수'를 만드는 장치가 아닙니다. CRNG 출력은 계산적으로만 안전하므로 정보 이론적 의미의 일회용 패드가 되지 않습니다.

## 블록체인·암호화폐에서는

CRNG는 지갑 보안의 출발점입니다. 개인 키, BIP-39 니모닉 엔트로피, 서명 난스(RFC 6979의 결정론적 방식이 아니라면), 키 교환용 임시 키가 모두 CRNG에서 나옵니다. 실패 사례도 많습니다. 2013년 안드로이드 SecureRandom 결함으로 여러 비트코인 지갑에서 서명 난스가 반복되어 자금이 탈취되었고, 2022년 이더리움 배니티 주소 생성기 Profanity는 32비트 시드를 써서 대규모 탈취로 이어졌으며, 2023년 'Milk Sad' 사건에서는 Libbitcoin Explorer가 메르센 트위스터로 시드를 만든 것이 문제였습니다. 하드웨어 지갑은 전용 하드웨어 난수원과 검증된 DRBG를 결합해 이 위험을 줄입니다.

## 쉽게 말하면

CRNG는 '구경꾼이 지금까지 나온 숫자를 전부 봐도 다음 숫자를 절대 맞힐 수 없는' 주사위입니다.

## 예시

파이썬에서 지갑 키를 만들 때 random.getrandbits(256)이 아니라 secrets.token_bytes(32)를 써야 합니다. 앞의 것은 메르센 트위스터, 뒤의 것은 운영체제 CRNG를 사용합니다.

---
출처: https://achivx.kr/glossary/cryptographic-random-number-generator-crng-%EC%95%94%ED%98%B8%ED%95%99%EC%A0%81-%EB%82%9C%EC%88%98-%EC%83%9D%EC%84%B1%EA%B8%B0-crng/ · ACHIVX 용어 사전 · 수정일 2026-10-20
