재생 공격과 논스 재사용 취약점
GCM 및 기타 모드에서 논스를 재사용하면 암호문 기밀성이 완전히 침해될 수 있는 이유를 이해합니다.
재생 공격과 논스 재사용 취약점은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
암호학에서 논스의 목적
논스(한 번만 사용하는 수)는 같은 평문 메시지를 두 번 암호화해도 서로 다른 암호문이 생성되도록 합니다. 이는 의미론적 보안에 필수적입니다. 공격자가 여러 암호문을 관찰하더라도 해당 암호문이 같은 평문을 암호화한 것인지 다른 평문을 암호화한 것인지 알 수 없어야 하기 때문입니다. 스트림 암호와 CTR 모드 블록 암호에서는 논스가 키스트림 생성을 위한 초깃값 역할을 하므로 보안에 매우 중요합니다.
카운터 초기화로 사용하는 GCM 논스
AES-GCM에서는 96비트 논스를 사용해 CTR 모드 암호화용 카운터를 초기화하며, GHASH 인증 계산에도 논스가 기여합니다. 각 AES 블록의 카운터 값은 논스에서 시작해 증가시키는 방식으로 파생됩니다. 두 암호화 작업에서 같은 논스와 키를 사용하면 같은 키스트림이 생성되므로 두 암호문의 XOR은 두 평문의 XOR과 같아집니다.
GCM에서의 치명적인 논스 재사용
같은 (키, 논스) 쌍으로 암호화된 두 GCM 암호문에서는 암호문들의 XOR이 평문들의 XOR과 같습니다. 공격자가 한 평문을 알고 있다면(선택 평문 상황에서 흔히 발생함) 다른 평문을 즉시 복구할 수 있습니다. 알려진 평문이 없더라도 암호문들의 XOR은 언어 패턴을 드러내며, 추정 단어를 대입하는 기법으로 공격할 수 있습니다. 이는 암호학에서 가장 치명적인 오용 패턴 중 하나입니다.
논스 재사용을 통한 인증 키 복구
GCM 논스 재사용은 평문 복구를 넘어 또 다른 치명적인 결과를 초래합니다. GHASH 인증 키 H는 암호화 키만으로 파생됩니다. 두 메시지가 같은 (키, 논스) 쌍을 공유하면 공격자는 다항식 방정식을 풀어 H를 복구할 수 있습니다. H를 알고 나면 임의의 암호문에 대해 유효한 GCM 인증 태그를 위조할 수 있어 메시지 무결성이 완전히 무너집니다.
TLS 1.3의 논스 구성
TLS 1.3은 TLS 1.2 구현에서 발생한 논스 재사용 위험을 교훈으로 삼았습니다. TLS 1.3은 핸드셰이크에서 파생된 12바이트 쓰기 IV와 8바이트 순서 번호를 XOR하여 GCM 논스를 생성합니다. 이때 순서 번호는 12바이트가 되도록 앞부분을 0으로 확장합니다. 순서 번호는 모든 레코드마다 증가하므로 각 레코드가 고유한 논스를 사용합니다. 이렇게 하면 임의 논스 생성 위험을 없애면서 순서 번호 메커니즘을 통해 논스의 고유성을 보장할 수 있습니다.
재전송 공격 개요
재전송 공격은 유효한 메시지나 인증 토큰을 가로챈 뒤 나중에 다시 전송하여 부정한 결과를 얻는 공격입니다. 예를 들어 은행 거래를 재전송해 이중으로 청구하거나, 유효한 인증 응답을 재전송해 사용자를 사칭하거나, 서명된 명령을 장치에 재전송하는 경우가 있습니다. 공격자는 메시지를 이해하거나 수정할 필요 없이 캡처한 데이터를 다시 전송하는 것만으로 공격을 수행할 수 있습니다.
재전송 방지를 위한 시간 기록
인증된 메시지에 시간 기록을 포함하면 재전송을 방지할 수 있습니다. 수신자는 짧은 시간 범위 안에 있는 메시지만 수락합니다(예: 표시된 시간 기준 5분 이내). 몇 시간 전에 재전송된 메시지는 이 범위를 벗어나므로 거부됩니다. 공격자가 시간 기록을 수정하여 최신 메시지처럼 보이게 만들 수 없도록 시간 기록 자체도 인증되어야 합니다(HMAC 또는 AEAD 추가 데이터 안에 포함).
재전송 방지를 위한 순서 번호
순서 번호는 오래된 재전송뿐 아니라 중복 전달과 순서가 뒤바뀐 전달까지 탐지하므로 시간 기록보다 강력한 재전송 방지를 제공합니다. 수신자는 다음에 올 것으로 예상되는 순서 번호와 최근 확인된 번호의 슬라이딩 창을 유지합니다. 각 메시지는 허용되는 창 안의 순서 번호를 가져야 하며, 이전에 확인된 번호를 다시 사용해서도 안 됩니다. TLS는 세션 내 레코드 재전송을 방지하기 위해 순서 번호를 사용합니다.
안전한 논스 생성
AES-GCM에서 무작위 논스를 생성할 때 권장되는 방식은 암호학적으로 안전한 의사 난수 생성기(CSPRNG)에서 96비트 값을 얻는 것입니다. 96비트 무작위 논스를 사용하면 2^32회(약 40억 회) 암호화한 뒤 생일 경계에 따른 충돌 확률이 2^-32에 이릅니다. 대량 처리 애플리케이션에서는 카운터 기반 논스로 전환하거나, 안전 한계를 늘리기 위해 다른 AEAD(예: 192비트 논스를 사용하는 XChaCha20-Poly1305)를 사용해야 합니다.
결정적 논스: 카운터 관리
결정론적 카운터 기반 논스는 생일 경계 문제를 피할 수 있지만 신중한 상태 관리가 필요합니다. 카운터는 애플리케이션이 재시작된 후에도 유지되어야 합니다. 재시작할 때 카운터가 0으로 초기화되면 동일한 키에서 즉시 논스가 재사용됩니다. 카운터는 논스를 사용한 후가 아니라 사용하기 전에 원자적으로 갱신해야 합니다. 분산 시스템에서는 두 노드가 동일한 카운터 값을 사용하지 않도록 조정해야 합니다.
더 큰 논스를 위한 XChaCha20-Poly1305
XChaCha20-Poly1305는 ChaCha20-Poly1305의 논스 크기를 96비트에서 192비트로 확장합니다. 192비트 무작위 논스를 사용하면 2^96번 암호화한 후에도 생일 경계에 따른 충돌 확률이 무시할 수 있을 정도로 낮습니다(천문학적으로 큰 메시지 수입니다). 따라서 현실적인 생일 문제를 걱정하지 않고도 무작위 논스를 안전하게 생성할 수 있습니다. libsodium의 crypto_secretbox(XSalsa20-Poly1305)도 같은 이유로 192비트 논스를 사용합니다.
GCM 논스 재사용의 결과
동일한 키와 논스를 사용해 두 개의 GCM 암호문을 생성하면 공격자는 무엇을 복구할 수 있습니까?
논스 및 재전송 공격 복습
논스 재사용 복습: 논스는 암호문이 서로 다르도록 보장하고, GCM 논스를 재사용하면 평문 XOR이 노출되며 H 복구를 통해 인증이 무력화됩니다. TLS 1.3은 시퀀스 번호와 IV를 XOR하여 논스의 고유성을 보장합니다. 재전송 공격은 유효한 메시지를 변경하지 않고 다시 전송합니다. 인증된 메시지에 타임스탬프와 시퀀스 번호를 포함하면 재전송을 방지할 수 있습니다. GCM에는 생일 경계를 주의하면서 96비트 무작위 논스를 사용하고, 더 큰 무작위 논스 공간에는 XChaCha20을 사용하십시오.
자주 묻는 질문
“재생 공격과 논스 재사용 취약점” 강의는 무료인가요?
네 — “재생 공격과 논스 재사용 취약점” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“재생 공격과 논스 재사용 취약점”에서 뭘 배우나요?
GCM 및 기타 모드에서 논스를 재사용하면 암호문 기밀성이 완전히 침해될 수 있는 이유를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“재생 공격과 논스 재사용 취약점” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 패딩 오라클 공격 자세히 알아보기
- 재생 공격과 논스 재사용 취약점
- 애플리케이션 수준 코드의 타이밍 공격
- 주요 암호 오용 패턴