CoderTools

ChaCha20 암호화

선택적 인증이 가능한 현대적 스트림 암호

클라이언트 측 보안

ChaCha20-Poly1305(RFC 8439)가 권장 AEAD입니다. 순수 ChaCha20은 무결성 없음 — 항상 Poly1305와 함께 사용. 96비트 IETF nonce: 엄격한 고유성 강제. XChaCha20-Poly1305(192비트)로 안전한 무작위 nonce 생성.

ChaCha20(스트림만): 256비트 키, 96비트 nonce, 32비트 카운터, 20라운드; 인증 없음.

초기 카운터 값 (기본값: 0)

형식 옵션
🔒 100% 로컬 처리입력하신 데이터는 브라우저에서 완전히 처리되며, 서버로 전송되지 않습니다.

ChaCha20 소개

ChaCha20은 Bernstein이 설계한 ARX 스트림 암호(2008년, Salsa20 개선 변체)입니다. 동일한 4×4 행렬이지만 쿼터 라운드를 16-12-8-7 회전으로 재설계: 비트 확산이 2라운드 내 모든 16 워드에 전파(Salsa20은 4라운드). IETF(RFC 8439): 96비트 nonce + 32비트 카운터(최대 256 GB/nonce).

ChaCha20-Poly1305(RFC 7539→RFC 8439): IETF 표준화 AEAD. Poly1305 일회용 키를 카운터=0의 ChaCha20 출력 앞 32바이트에서 유도, 카운터=1부터 암호화. 128비트 인증 태그. Google 2014년 Android TLS 채택. TLS 1.3(RFC 8446): TLS_CHACHA20_POLY1305_SHA256 필수.

알고리즘 비교

알고리즘 인증 키 길이 논스 크기 사용 사례
ChaCha20 스트림 암호 256 bits 96 bits (12 bytes) 프로토콜 구현 연구; 상위 레이어에서 인증하는 스트리밍; 벤치마킹
ChaCha20-Poly1305 AEAD 256 bits 96 bits (12 bytes) TLS 1.3, WireGuard, SSH, QUIC, Signal; AES-NI 없는 모바일/임베디드; 타이밍 공격 저항 AEAD
XChaCha20 스트림 암호 256 bits 192 bits (24 bytes) 카운터로 nonce 고유성 보장 불가한 파일/DB 암호화; libsodium secretstream; 독립 nonce 백업 암호화
XChaCha20-Poly1305 AEAD 256 bits 192 bits (24 bytes) 무작위 nonce + 128비트 인증 필요한 정적 데이터; libsodium 앱 스토리지; 중앙 nonce 관리 불가 시 기본 AEAD

ChaCha20 작동 방식

4×4 초기화: 행0=상수 “expa nd 32-byte k”, 행1-2=256비트 키(8×32), 행3=[카운터|nonce₀|nonce₁|nonce₂](IETF). 쿼터 라운드(a,b,c,d): a+=b; d^=a; d⋘16; c+=d; b^=c; b⋘12; a+=b; d^=a; d⋘8; c+=d; b^=c; b⋘7.

이중 라운드 = 열 쿼터 라운드 + 대각선 쿼터 라운드. 회전 16-12-8-7: 2라운드에서 완전 확산(Salsa20: 4라운드). 10 이중 라운드; 출력 = 변환된 상태와 원래 상태의 XOR.

AEAD: 인증된 암호화

ChaCha20-Poly1305 AEAD(RFC 8439): 카운터=0으로 ChaCha20 실행, 앞 32바이트를 Poly1305 일회용 키로 사용. 카운터=1부터 평문 암호화. MAC: [패딩 AAD||패딩 암호문||len(AAD)||len(암호문)]. 16바이트 Poly1305 태그 첨부.

XChaCha20-Poly1305: HChaCha20으로 192비트 nonce 앞 128비트 + 원래 키에서 256비트 하위 키 유도. 2³² 메시지에서 충돌 확률 2^(-128). libsodium: crypto_aead_xchacha20poly1305_ietf_encrypt.

주요 특징

  • Salsa20보다 우수한 확산: 회전 16-12-8-7 → 2라운드 내 완전 확산(Salsa20: 4라운드). ChaCha20/8 ≈ Salsa20/16 보안.
  • IETF 표준화(RFC 8439, 2018): TLS 1.3, WireGuard, SSH, QUIC, Signal, Noise Protocol, Android TLS.
  • AES 독립 성능: AES-NI 없는 ARM Cortex-A53/A55, RISC-V, MIPS에서 AES-GCM보다 25-40% 빠름. IoT/모바일/임베디드 최적.
  • 96비트 IETF nonce: 32비트 카운터(최대 256 GB/nonce). XChaCha20: 192비트로 안전한 무작위 nonce 생성.
  • ChaCha20/20에 알려진 공격 없음(2025년). 최선의 감소 라운드 분석: Shi 등(2012) ChaCha20/6.

보안 고려사항

  • ChaCha20-Poly1305에서 nonce 재사용은 치명적: XOR 평문 노출 + Poly1305 키 노출. TLS 1.3: nonce = 시퀀스 번호 XOR.
  • 32비트 카운터 한계: 최대 256 GB/(키, nonce). TLS 1.3은 key_update로 자동 재키잉.
  • Poly1305 일회용 키 요건: nonce 재사용 → Poly1305 키 재사용 → 위조 공격(Bernstein 2005). RFC 8439 §2.8.
  • 인증 태그 절단 금지: RFC 8439는 16바이트 요구. 64비트 절단 → 2^(-64), TLS 1.3 비준수.

실제 사용

  • TLS 1.3(RFC 8446): TLS_CHACHA20_POLY1305_SHA256 필수. OpenSSL, BoringSSL, NSS, WolfSSL, mbedTLS.
  • WireGuard VPN: 유일한 대칭 암호(Donenfeld 2017, Linux 5.6). Curve25519, Poly1305, BLAKE2, SipHash와 결합.
  • Signal Protocol/Double Ratchet: X3DH 후 ChaCha20-Poly1305. WhatsApp, Messenger 비밀 대화, Matrix, Keybase.
  • OpenSSH chacha20-poly1305@openssh.com(6.5, 2014): 두 ChaCha20 인스턴스로 타이밍 누출 제거.
  • Google 모바일 TLS(2014): Langley+Duong. Nexus 5 Cortex-A15에서 AES-128-GCM보다 3배 빠름. IETF 표준화 영향.

참고 자료

빠른 메뉴

최근 사용 도구 없음