Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조
승인된 각 NIST DRBG 메커니즘의 내부 상태와 출력 생성 과정을 살펴봅니다.
Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
DRBG 내부 상태 구성 요소
세 가지 NIST DRBG 메커니즘은 각각 기반 알고리즘의 접근 방식을 반영하는 서로 다른 내부 상태 구성 요소를 유지합니다. Hash_DRBG는 V(해시 길이의 시드)와 C(V에서 파생되어 출력 생성 중 사용되는 상수)를 저장합니다. HMAC_DRBG는 키 K(해시 길이의 비밀 키)와 값 V(해시 길이의 체이닝 값)를 저장합니다. CTR_DRBG는 키 K(AES 키)와 V(블록 길이의 카운터)를 저장합니다. 세 메커니즘 모두 마지막 시드 설정 이후의 Generate 호출 횟수를 추적하는 reseed_counter를 유지합니다. 상태 크기가 메모리 사용량을 결정합니다. SHA-256을 사용하는 Hash_DRBG와 HMAC_DRBG의 상태는 64바이트이고, AES-256을 사용하는 CTR_DRBG의 상태는 48바이트입니다(32바이트 키 + 16바이트 카운터).
Hash_DRBG: Hash_df 도출 함수
Hash_DRBG는 엔트로피 자료에서 상태를 도출하기 위해 Hash_df(해시 도출 함수)를 사용합니다. Hash_df(input_string, no_of_bits_to_return)는 다음을 반복합니다. counter = 1, 2, ...일 때 H(counter || no_of_bits || input_string)을 계산하고, 충분한 비트가 생성될 때까지 출력을 연결합니다. 이를 통해 짧은 엔트로피 입력을 상태 크기의 시드로 확장합니다. Generate 중 출력 함수는 W = H(0x03 || V)를 계산하며, 0x03 접두사는 이 사용을 다른 해시 사용과 구분합니다. 출력 루프에서는 data = H(0x01 || V)를 계산하고, V = V + 1을 수행한 다음 더 많은 출력을 위해 반복합니다. 생성이 끝나면 V를 V = V + H(0x03 || V) + C + reseed_counter로 업데이트합니다. 접두사 바이트(0x01, 0x03)를 사용한 도메인 분리는 생성 단계의 출력이 상태 업데이트 단계의 출력으로 혼동되는 것을 방지합니다.
HMAC_DRBG: Update 함수
HMAC_DRBG의 Update 함수는 모든 상태 전환의 핵심입니다. Update(provided_data, K, V): K = HMAC(K, V || 0x00 || provided_data); V = HMAC(K, V)로 처리합니다. provided_data가 비어 있지 않으면 K = HMAC(K, V || 0x01 || provided_data); V = HMAC(K, V)를 수행합니다. 이 두 단계 업데이트는 새 키와 값이 이전 상태 및 새로운 엔트로피 모두에 의존하도록 보장합니다. Generate에서는 충분한 비트가 생성될 때까지 V = HMAC(K, V)를 반복하고 결과를 출력에 추가한 다음, additional_input으로 Update를 호출하여 상태를 진행합니다. HMAC_DRBG의 보안은 HMAC가 안전한 PRF라는 가정으로 환원됩니다. HMAC 출력을 난수와 구별할 수 없는 공격자는 DRBG 출력도 난수와 구별할 수 없습니다.
CTR_DRBG: Block_Cipher_df
CTR_DRBG는 Block_Cipher_df(도출 함수)를 사용하여 시드 자료를 키와 카운터 형식으로 처리합니다. Block_Cipher_df(input_string, no_of_bits)는 BCC(블록 암호 연쇄) 구성을 사용하며, 입력 청크에 AES-CBC를 반복 적용하여 필요한 길이의 출력을 생성합니다. 이 도출 함수는 가변 길이 엔트로피 입력을 처리하고 도메인 분리를 제공하는 데 필요합니다. 도출 함수가 없는 CTR_DRBG는 정확한 형식의 입력을 사용하는 FIPS 테스트에서 허용되며 더 빠르지만, 입력 형식 요구 사항에 더 민감합니다. Generate 루프에서는 temp = E(K, V)를 계산하고, V = V + 1을 수행한 다음 temp를 출력에 추가합니다. Update에서는 K || V = Block_Cipher_df(V || additional_input, seedlen)을 계산하고 현재 키와 XOR 연산을 적용합니다.
DRBG 성능 비교
성능은 DRBG 유형에 따라 크게 달라집니다. AES-NI를 사용하는 현대 x86_64 CPU에서 CTR_DRBG (AES-256)는 약 5~10 GB/s의 의사 난수 출력을 달성합니다. AES-NI 명령어 덕분에 AES 계산 비용이 거의 들지 않기 때문입니다. HMAC_DRBG (SHA-256)는 약 200~400 MB/s를 달성합니다. SHA-256은 빠르지만 같은 수준으로 하드웨어 가속되지는 않습니다. Hash_DRBG (SHA-256)는 약 100~300 MB/s를 달성합니다. 대량 키 생성이나 스트림 암호 대체에는 CTR_DRBG가 훨씬 빠릅니다. 처리량이 낮은 용도(세션 키 생성, 논스 도출)에서는 성능 차이가 중요하지 않습니다. OpenSSL 3.0이 CTR_DRBG (AES-256)를 기본값으로 사용하는 이유도 여기에 있습니다.
인스턴스화와 개인화 문자열
인스턴스화할 때 세 DRBG는 모두 선택적 personalization_string을 받아 엔트로피 입력과 혼합하여 DRBG 인스턴스를 고유하게 만듭니다. 따라서 동일한 엔트로피로 동시에 인스턴스화된 두 DRBG도 같은 출력을 생성하지 않고 개인화 문자열에 따라 서로 다른 상태로 진행합니다. 권장되는 개인화 문자열은 애플리케이션 식별자 + 프로세스 ID + 스레드 ID + 타임스탬프 + 하드웨어 식별자입니다. 두 VM이 동일한 엔트로피를 받더라도(클라우드 VM 스냅샷 문제), 서로 다른 개인화 문자열을 사용하면 서로 다른 DRBG 스트림이 생성됩니다. NIST SP 800-90C는 항상 개인화 문자열을 사용할 것을 권장합니다. 논스 매개변수도 비슷한 역할을 합니다. 즉, 어떤 두 인스턴스화도 동일한 상태에서 시작하지 않도록 보장하는 고유한 짧은 값입니다.
Generate 호출의 추가 입력
세 DRBG는 모두 Generate 호출에서 additional_input 매개변수를 지원합니다. 이를 통해 호출자는 완전한 재시드 없이 단일 생성 호출에 추가 컨텍스트나 엔트로피를 주입할 수 있습니다. 용도는 다음과 같습니다. (1) 보조 엔트로피 원천에서 요청마다 엔트로피를 주입합니다. (2) 애플리케이션 수준의 컨텍스트(요청 ID, 타임스탬프)를 제공하여 생성된 값이 사용 목적에 연결되도록 합니다. (3) OS에서 새로운 엔트로피를 주입하여 선택적으로 예측 저항성을 제공합니다. additional_input은 출력이 생성되기 전에 DRBG 상태에 혼합됩니다. additional_input이 실제 엔트로피를 제공하면 엔트로피 원천 인터페이스와 관련 오버헤드가 필요한 공식적인 재시드 없이도 보안이 향상됩니다.
상태 제로화와 키 폐기
DRBG의 인스턴스가 해제된 후(또는 새 인스턴스로 전환할 때) 내부 상태를 안전하게 제로화해야 합니다. 상태 V, C(Hash_DRBG), K, V(HMAC/CTR_DRBG) 및 모든 중간 작업 변수를 0으로 덮어써야 합니다. 이를 명시적 제로화라고 하며 FIPS 140-3 모듈에서 의무적으로 요구됩니다. C 코드에서는 explicit_bzero() 또는 SecureZeroMemory()를 사용해야 합니다. 컴파일러 최적화로 인해 memset이 사용되지 않는 저장 연산으로 판단되어 제거되면 메모리에 키 자료가 남을 수 있습니다. Rust의 zeroize 크레이트와 유사한 언어별 솔루션은 이 작업을 이식성 있게 처리합니다. 메모리 덤프, 콜드 부트 공격 또는 프로세스 검사 도구가 잔여 상태를 노출할 수 있는 상황에서는 안전한 키 폐기가 중요합니다.
DRBG 테스트: CAVP 벡터
NIST는 모든 SP 800-90A DRBG에 대해 암호 알고리즘 검증 프로그램(CAVP) 테스트 벡터를 제공합니다. 테스트 유형은 다음과 같습니다. (1) 알려진 답 테스트(KAT): 고정된 엔트로피 입력, 논스, 개인화 문자열이 주어졌을 때 생성된 출력이 사전 계산된 값과 일치하는지 확인합니다. (2) 재시드 테스트: 재시드 작업 후 DRBG 상태가 올바른지 확인합니다. (3) PR(예측 저항성) 테스트: prediction_resistance=true를 요청했을 때 새로운 엔트로피를 주입한 후 올바른 출력이 생성되는지 확인합니다. FIPS 140-3 제출에는 CAVP 검증이 필요합니다. 오픈 소스 라이브러리(OpenSSL, mbedTLS)는 DRBG 구현의 회귀를 발견하기 위해 회귀 테스트 모음에 CAVP 테스트 벡터를 포함합니다.
DRBG 구현의 부채널 위험
DRBG 구현은 알고리즘 보안 모델을 넘어 미묘한 부채널 위험에도 노출됩니다. AES에 대한 캐시 타이밍 공격은 AES-NI가 없는 CTR_DRBG에서 라운드 키 자료를 유출할 수 있습니다. AES-NI는 테이블 조회 없이 레지스터에서 계산하여 이 문제를 제거합니다. HMAC_DRBG는 내부적으로 HMAC를 사용하며, 기반 SHA-256이 상수 시간으로 동작하면 HMAC도 상수 시간으로 동작합니다. SHA-256은 데이터에 따라 달라지는 분기가 없으므로 일반적으로 상수 시간 알고리즘으로 간주됩니다. DRBG를 생성하는 하드웨어에 대한 물리적 부채널(전력 분석, EM 방사)은 스마트 카드와 IoT 장치에서 우려되는 문제이며, 마스킹 구현으로 대응합니다. 상태 백업 공격도 있습니다. 공격자가 메모리 노출 취약점(Heartbleed와 유사한 방식)을 통해 DRBG 상태를 읽을 수 있으면, 새로운 엔트로피로 다음 재시드가 이루어질 때까지 이후의 모든 출력이 손상됩니다.
손상 후 DRBG 상태 복구
DRBG 상태가 손상된 경우(예: 메모리 노출 취약점을 통해), 복구에는 다음이 필요합니다. (1) 손상 감지: DRBG 상태 유출은 스스로 드러나지 않으므로 외부 모니터링이나 무결성 검사가 필요합니다. (2) 손상에 관련되지 않은 신뢰할 수 있는 원천에서 새로운 엔트로피로 재시드합니다. (3) 손상된 DRBG에서 파생된 모든 암호 자료를 새 키로 교체합니다(마지막으로 정상적인 재시드 이후 생성된 세션 키와 서명 키 포함). (4) 소프트웨어 구현에서는 프로세스를 다시 시작하여 깨끗한 DRBG 인스턴스화를 수행합니다. SP 800-90C는 연쇄형 엔트로피 원천을 권장합니다. 한 원천이 손상되더라도 다른 원천이 실제 엔트로피를 제공하면 결합된 원천이 계속 보안을 제공합니다.
DRBG 상태 퀴즈
현대 CPU에서 대량의 의사 난수 출력을 생성할 때 어떤 DRBG 메커니즘이 가장 빠릅니까?
DRBG 내부 구조 요약
Hash_DRBG는 도출에 Hash_df를 사용하는 반복 해시를 사용하며, H(0x01 || V) 루프로 출력을 생성합니다. HMAC_DRBG는 HMAC를 PRF로 사용하고, 키 다음 값 순서로 처리하는 두 단계 Update 함수를 통해 명확한 보안 환원을 제공합니다. CTR_DRBG는 Block_Cipher_df와 함께 카운터 모드에서 AES를 사용하며, AES-NI 하드웨어에서 5~10 GB/s를 달성합니다. 세 메커니즘 모두 인스턴스화를 시작할 때 인스턴스의 고유성을 위한 personalization_string을 받고, 각 생성 작업에서 컨텍스트 연결을 위한 additional_input을 받을 수 있습니다. CAVP 테스트 벡터가 구현을 검증합니다. 사용이 끝난 상태는 안전하게 제로화해야 합니다. 상태가 손상된 경우에는 새로운 엔트로피로 재시드하고 파생된 자료의 키를 교체해야 합니다.
자주 묻는 질문
“Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조” 강의는 무료인가요?
네 — “Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조”에서 뭘 배우나요?
승인된 각 NIST DRBG 메커니즘의 내부 상태와 출력 생성 과정을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- NIST SP 800-90A: DRBG 표준
- Hash-DRBG, HMAC-DRBG 및 CTR-DRBG 내부 구조
- Dual EC DRBG 백도어 사건
- RNG 구현 테스트와 검증