와 chacha20?

이세민·2025년 7월 21일

ChaCha20이란?

Daniel J. Bernstein이 2008년에 개발한, 대칭키 스트림 암호입니다.
하드웨어 가속 없이도 높은 성능을 가지고 있어, TLS나 VPN에서도 사용됩니다.


state

ChaCha20은 각각의 블록을 암호화하기 위해 key stream을 생성하는데,
이 key stream을 생성하기 위한 초기 값을 state라고 합니다.
ChaCha20의 state는 16개의 32비트 워드로, 총 512비트로 이루어져 있습니다.
각 state는 다음과 같은 요소로 이루어져 있습니다.

  • 상수
    4개의 32비트 상수로 ChaCha20 알고리즘의 고유한 상수입니다.
    일반적으로 "expand 32-byte k"라는 ASCII 문자열을 4개의 32비트 워드로 해석하여 사용합니다.


  • 8개의 32비트 워드, 즉 총 256비트로 구성된 대칭키입니다.
    암호화와 복호화에 동일한 키가 사용되며, 보안을 위해 충분히 랜덤하게 생성되어야 합니다.

  • 카운터
    1개의 32비트 워드로, 현재 처리 중인 블록의 번호를 나타냅니다.
    블록 번호가 증가할수록 key stream도 달라지므로, 같은 키와 nonce를 사용하더라도 다른 암호문을 생성할 수 있게 합니다.

  • 논스 (Nonce)
    3개의 32비트 워드, 즉 96비트로 구성되며, 한 번만 사용하는 값입니다.
    하나의 키로 여러 메시지를 암호화할 경우, 논스를 변경하여 동일한 key stream이 재사용되지 않도록 합니다.

암호화 및 복호화 방법

ChaCha20은 스트림 암호이므로, 평문과 key stream을 바이트 단위로 XOR하여 암호문을 생성합니다.
복호화 역시 동일한 key stream을 XOR하여 원래 평문을 복원합니다.

Plain XOR Key = Cipher
Cipher XOR Key = Plain

조심할 취약점

같은 Key로 여러번 암호화를 진행하면 평문을 유추할 수 있습니다.

plain1 xor key = cipher1
plain2 xor key = cipher2

cipher1 xor cipher2
= plain1 xor key xor plain2 xor key
= plain1 xor plain2

이렇게 같은 key로 여러번 암호화를 진행하면 두 평문의 xor값을 구할 수 있게 되어 여러번 반복할시 평문 유추가 가능합니다.
이를 막기위해 chacha20에서는 nonce와 key를 사용하여 여러번 암호화하여도 문제가 발생하지 않게 합니다.

안전하게 Key Stream 만들기

ChaCha20은 16개의 32비트 워드로 구성된 state에 대해 총 20번의 라운드(round)를 수행합니다.
라운드는 덧셈, XOR, 회전 같은 연산을 수행하면서 state를 유추하기 어려운 Key Stream을 생성합니다. 라운드 과정은 비밀번호 해싱처리처럼 암호화 키로 실제 키와 state를 유추하기 어렵게하는 과정입니다.

사용처

ChaCha20은 XOR 처럼 간단한 연산만으로 높은 보안성을 가지고 있어서, 다양한 곳에 사용됩니다.
ex) https, tls, ssh


마무리

이런 보안관련 개념을 배우면서, 저비용으로 암호화하고, 복호화하기 거의 불가능하게 설계된 이런 기술들이 정말 신기합니다...

profile
gsm 8기 고등학생

0개의 댓글