# ChaCha20-Poly1305 (ChaCha20 Stream Cipher with Poly1305 Authenticator)

ChaCha20-Poly1305는 다니엘 번스타인이 설계한 ChaCha20 스트림 암호와 Poly1305 메시지 인증기를 결합한 인증 암호화(AEAD) 방식입니다. RFC 8439(이전 RFC 7539를 대체)에 규정되어 있으며, AES 하드웨어 가속이 없는 기기에서도 빠르고 안전하게 동작해 AES-GCM의 대표적인 대안으로 쓰입니다.

## 자세히 알아보기

ChaCha20은 256비트 키, 96비트 논스, 32비트 블록 카운터로 키스트림을 만들고 평문과 XOR해 암호화합니다. 내부는 덧셈·회전·XOR(ARX) 연산만 사용하므로 테이블 조회가 없고, 비밀 데이터에 따라 실행 시간이 달라지지 않는 상수 시간 구현이 자연스럽습니다. Poly1305는 각 메시지마다 ChaCha20으로 만든 일회용 키를 사용해 암호문과 추가 데이터(AAD)에 대한 128비트 태그를 계산합니다.

AES-GCM과 마찬가지로 같은 키와 논스 조합을 재사용하면 기밀성과 인증이 모두 무너집니다. 96비트 논스는 무작위로 생성하기에는 충돌 여유가 크지 않으므로, 카운터로 관리하거나 192비트 논스를 쓰는 변형 XChaCha20-Poly1305(libsodium 등에서 널리 사용, IETF 초안)를 선택합니다. 보안 강도는 256비트 키 기준으로 충분하며, 현재 알려진 실질적인 공격은 없습니다.

성능 면에서는 AES-NI가 있는 서버 CPU에서는 AES-GCM이 더 빠른 경우가 많고, 모바일·임베디드처럼 가속이 없는 환경에서는 ChaCha20-Poly1305가 유리합니다. 그래서 TLS 1.3은 두 방식을 모두 지원하고 클라이언트 환경에 따라 선택합니다.

두 구성 요소는 따로 먼저 발표되었습니다. Poly1305는 2005년 AES와 결합한 Poly1305-AES로 처음 제안되었고, ChaCha20은 2008년 Salsa20을 개선한 변형으로 발표되었습니다. IETF 버전은 이 둘을 AEAD 형태로 묶고 논스 길이를 96비트로 정한 것입니다.

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

Bitcoin Core는 BIP-324 'v2 P2P 전송'에서 노드 간 통신을 ChaCha20-Poly1305로 암호화해 네트워크 도청과 단순 트래픽 변조를 어렵게 만들었습니다. 라이트닝 네트워크 노드 간 연결(BOLT 8)도 ChaCha20-Poly1305를 사용합니다. 이 밖에 TLS 1.3, WireGuard VPN, OpenSSH 등에서 쓰이므로, 지갑 앱과 거래소 서버의 통신에도 자주 등장합니다.

## 쉽게 말하면

특별한 하드웨어 없이 어떤 휴대폰에서도 빠르게 돌아가는 '봉투 + 봉인 스티커' 세트입니다.

## 예시

TLS 1.3의 TLS_CHACHA20_POLY1305_SHA256 스위트는 키 교환으로 얻은 비밀에서 HKDF-SHA256으로 32바이트 키와 12바이트 IV를 유도하고, 레코드마다 순번을 IV에 XOR해 논스가 절대 반복되지 않게 합니다.

---
출처: https://achivx.kr/glossary/chacha20-poly1305-chacha20-poly1305-%EC%9D%B8%EC%A6%9D-%EC%95%94%ED%98%B8%ED%99%94/ · ACHIVX 용어 사전 · 수정일 2026-10-20
