ChaCha20-Poly1305 암호 (RFC 8439)
브라우저에서 AEAD_CHACHA20_POLY1305로 암·복호화하고, Poly1305 일회용 키와 카운터 분리를 함께 봅니다.
사용법
- RFC 8439 벡터를 불러와 공표된 답이 있는 경우를 보고, 한 바이트만 바꿔 태그가 움직이는 것을 확인하세요.
- 자기 데이터라면 무작위 버튼으로 새 키와 논스를 받고, 평문과 추가 데이터를 넣어 암호화합니다.
- 받은 것을 확인할 때는 복호화로 바꿔 암호문과 태그를 붙여 넣으세요 — 태그가 검증될 때만 평문이 나옵니다.
- 직접 쓰는 구현과 비교할 때는 일회용 키와 카운터 설명을 읽으세요. 손으로 만든 버전이 갈라지는 지점이 거기입니다.
자세한 설명
펼치기접기
ChaCha20-Poly1305으로 메시지를 봉인하거나 받은 것을 열어 태그를 검증하고, 그 과정에서 구성이 만들어 내는 중간값을 봅니다. TLS 1.3·WireGuard·SSH·age가 모두 쓰는 AEAD이고, 기댈 AES 하드웨어가 없을 때 집어 드는 것입니다. ChaCha20은 덧셈·XOR·회전뿐이라 어떤 기기에서도 예측 가능한 속도로 돌고, 캐시로 흘러나갈 룩업 테이블이 없습니다. 이 구성은 원시 함수 둘을 붙인 것인데 손으로 만들면 미묘하게 틀리기 쉬워서, 내부값을 화면에 띄웁니다. ChaCha20 스트림의 카운터 0은 데이터에 아예 쓰이지 않습니다. 그 블록의 앞 32바이트가 일회용 Poly1305 키가 되고, 평문용 키스트림은 카운터 1에서 시작합니다. 여기서 하나 어긋나면 자기끼리는 일관되게 암·복호화되지만 다른 어떤 구현과도 호환되지 않는 것이 나옵니다. 이어서 MAC은 추가 데이터와 암호문, 그리고 둘의 길이를 64비트 리틀엔디언으로 덮고, 앞의 두 부분은 각각 16바이트 경계까지 패딩합니다 — 패딩이나 길이를 빼면 보낸 적 없는 메시지의 태그가 검증됩니다. Poly1305 키의 r 절반은 쓰기 전에 클램프되며 그것도 표시합니다. 여기서 복호화는 태그가 검증되지 않으면 평문을 내주지 않습니다. 그것이 AEAD와 체크섬을 덧붙인 암호를 갈라놓는 성질입니다. 툴은 탭 안에서 키·논스 조합도 추적합니다. 한 조합으로 다른 메시지 둘을 암호화하면 평문들의 XOR이 드러나고 Poly1305 키가 유출되어 이후 태그를 마음대로 위조할 수 있으므로, 조용히 넘기지 않고 크게 알립니다.
자주 묻는 질문
키스트림은 왜 카운터 1에서 시작하나요?
카운터 0이 Poly1305 키를 만드는 데 쓰이기 때문입니다. 이 AEAD는 카운터 0으로 ChaCha20 블록 함수를 한 번 호출해 그 블록의 앞 32바이트를 일회용 인증 키로 삼고, 평문은 카운터 1부터 시작하는 스트림으로 암호화합니다. 데이터를 0에서 시작하는 구현은 자기끼리는 맞지만 그 무엇과도 호환되지 않습니다.
논스를 재사용하면 어떻게 되나요?
같은 키·논스로 메시지 둘을 보내면 공격자는 평문들의 XOR을 얻고, 그것만으로 충분한 경우가 많습니다. 더 나쁜 것은 두 메시지가 같은 일회용 Poly1305 키를 공유한다는 점입니다. 그 키 하나로 유효한 태그 둘을 보면 키를 복구할 수 있고, 그 뒤엔 원하는 메시지의 태그를 위조할 수 있습니다. 성능 저하가 아니라 파괴이고, 그래서 툴이 경고합니다.
MAC 입력에 길이가 왜 들어가나요?
길이가 없으면 추가 데이터와 암호문의 경계가 모호해지고, 공격자가 태그를 유효하게 유지한 채 바이트를 한쪽에서 다른 쪽으로 옮길 수 있습니다. 이 구성은 두 부분을 각각 16의 배수로 패딩한 뒤 AAD 길이와 암호문 길이를 64비트 리틀엔디언 정수로 덧붙이는데, 정확히 그 경계를 못 박기 위한 것입니다.
AES-GCM과 비교하면 어떤가요?
둘 다 16바이트 태그와 12바이트 논스를 쓰는 AEAD이고, 둘 다 논스 재사용에 치명적으로 무너집니다. AES-GCM은 AES 명령이 있는 곳에서 더 빠르고 없는 곳에서는 더 느리며 부채널에 더 취약합니다. ChaCha20-Poly1305은 소프트웨어에서 고르게 빠르고 테이블 조회가 없습니다. GCM은 태그를 잘라 쓰면 안전성이 떨어지지만 Poly1305는 태그 길이가 하나뿐입니다. 새 프로토콜이라면 둘 다 변호할 수 있고, 모바일·임베디드에서는 보통 ChaCha20-Poly1305가 이깁니다.
실제 비밀에 써도 안전한가요?
산술은 RFC 8439의 모든 테스트 벡터와 별도 구현으로 검증했지만, 그것은 배포해도 안전하다는 뜻이 아닙니다. 브라우저 탭 안 자바스크립트에서 돌고, 상수 시간 보장이 없으며, 키는 텍스트 필드와 이 페이지의 로컬 스토리지에 들어 있습니다. 구현을 확인하거나 구성을 이해하는 데 쓰고, 중요한 것에는 검토된 라이브러리를 쓰세요.
관련 도구
AES-GCM 암복호화 (키·논스·AAD)
브라우저에서 AES-GCM으로 암복호화합니다. hex 키와 논스, 선택적 AAD, 태그 길이 선택, 그리고 암호문과 태그를 분리해 보여 줍니다.
개발
TLS 암호 스위트 디코더
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 같은 IANA 등록 암호 스위트 이름을 붙여넣으면 키 교환·인증·대칭 암호·모드·MAC으로 분해해 보여주고, 순방향 비밀성·AEAD·해시 강도·이미 깨진 알고리즘까지 점검해 등급을 매깁니다.
네트워크
OCSP 응답·요청 디코더
OCSP 응답과 요청을 브라우저에서 해석합니다. 상태, 응답기, 신선도, 논스, 폐기 사유, 동봉된 인증서까지 보여줍니다.
개발
DNSSEC 계산기 — DS 레코드와 NSEC3 해시
DNSKEY를 등록기관이 요구하는 DS 레코드로 바꿉니다. 키 태그와 세 가지 다이제스트 종류 전부, 또는 NSEC3 방식으로 이름을 해시합니다.
네트워크
Ed25519 서명·검증 (RFC 8032)
브라우저에서 Ed25519 키로 메시지에 서명하거나 서명을 검증하고, 시드에서 나온 공개 키와 R·S 값을 함께 봅니다.
개발
Argon2 해시 생성·검증기 (Argon2id)
Argon2id·Argon2i·Argon2d로 비밀번호를 해시해 $argon2id$ PHC 문자열을 만들거나, 저장된 해시와 비밀번호가 맞는지 확인합니다. 브라우저에서만 실행됩니다.
개발