개발 이야기4분 읽기

RC4·SPECK·XXTEA — 물러난 암호를 여전히 만나는 이유

표준에서 빠지거나 표준이 된 적 없는 암호 셋. 각각 왜 밀려났고 지금 어디에 남아 있는지 정리했습니다.

옛 코드를 열면 지금은 쓰지 않는 암호가 나옵니다. 셋을 봅니다.

RC4 — 두 번째 바이트가 편향된다

RC4는 스트림 암호입니다. 키에서 바이트 열(키스트림)을 만들어 평문과 XOR 합니다. 구현이 짧고 빨라서 오래 널리 쓰였습니다.

XOR이라 복호화가 암호화와 같은 연산입니다.

평문     attack at dawn
암호문   8c42a67de1cff6c746ebdfbd8488
한 번 더 attack at dawn

문제는 키스트림이 균등하지 않다는 점입니다. 무작위 16바이트 키 40만 개로 첫 두 바이트의 분포를 재 봤습니다.

균등하다면 각 값은 1,563회
1번째 바이트가 0x00 : 1,550회 (0.99배)
2번째 바이트가 0x00 : 2,977회 (1.91배)

두 번째 바이트가 0x00이 될 확률이 두 배입니다. 2001년에 알려진 편향이고, 여기서 재현된 1.91배는 이론값 2/256에 맞습니다.

한 번의 통신에서는 이것으로 아무것도 못 합니다. 같은 평문이 여러 세션에서 반복될 때 달라집니다 — HTTPS 쿠키처럼 매 요청 같은 자리에 오는 값이 그렇습니다. 요청을 충분히 모으면 편향이 쌓여 그 바이트를 복원할 수 있습니다. TLS가 RC4를 금지한 이유입니다(RFC 7465, 2015년).

편향과 별개로, 스트림 암호에는 키스트림을 재사용하면 안 된다는 제약이 있습니다.

두 암호문 XOR : 00000000000000000008000000000000
두 평문   XOR : 00000000000000000008000000000000

같은 키로 두 메시지를 암호화하면, 암호문끼리 XOR한 값이 평문끼리 XOR한 값과 같아집니다. 키가 소거됩니다. transfer 100 usdtransfer 900 usd의 차이가 그대로 드러납니다.

SPECK — 표준화가 거절됐다

SPECK은 2013년 NSA가 공개한 경량 블록 암호입니다. 사물인터넷 기기처럼 자원이 적은 환경을 겨냥했고, 코어 연산이 덧셈·회전·XOR 셋뿐이라 아주 작게 구현됩니다.

2018년 ISO/IEC 표준화 과정에서 거절됐습니다. 암호 자체가 깨진 것이 아니라, 설계 근거를 묻는 질문에 NSA가 충분히 답하지 않았다는 신뢰 문제였습니다. 리눅스 커널도 2018년에 들어갔던 SPECK 지원을 다시 뺐습니다.

표준을 못 받은 암호는 그 뒤로 검토가 얇아집니다. 지금 새로 고른다면 같은 자리에 ASCON이 있습니다 — NIST가 2023년 경량 암호 표준으로 선정했습니다.

XXTEA — 짧아서 남았다

XXTEA는 TEA 계열의 마지막 판본입니다(Corrected Block TEA, 1998년). 전체 구현이 스무 줄 남짓이라 라이브러리 없이 붙여 넣을 수 있습니다. 게임 리소스 파일이나 임베디드 펌웨어에서 계속 마주치는 이유가 대체로 이것입니다.

2010년에 선택 평문 공격이 발표됐고, 이후 라운드 수를 줄인 변형에 대한 결과가 더 나왔습니다. 표준화된 적이 없어 검증 물량 자체가 AES와 비교되지 않습니다.

실무에서 XXTEA를 만나면 대개 암호화가 아니라 난독화 목적입니다. 리소스 파일을 텍스트 에디터로 열었을 때 내용이 안 보이게 하는 용도라면 그 목적은 달성합니다. 그것을 보안 경계로 삼는 것이 문제입니다 — 키가 같은 바이너리 안에 들어 있기 때문입니다.

지금 무엇을 고르는가

자리 지금
범용 대칭 암호 AES-GCM 또는 ChaCha20-Poly1305
스트림 암호가 필요할 때 ChaCha20 (RC4 자리)
자원이 적은 환경 ASCON
무결성까지 위 조합은 인증 태그를 함께 냅니다

RC4·SPECK·XXTEA에 공통으로 없는 것이 인증입니다. 셋 다 암호문 변조를 감지하지 못합니다. 한 비트를 뒤집으면 평문의 대응하는 비트가 뒤집힌 채 복호화가 "성공"합니다.

확인 순서

  1. 코드에서 RC4, ARC4, rc4_setup, TEA, XXTEA, speck 문자열을 찾습니다
  2. 스트림 암호를 쓴다면 같은 키·논스 조합이 재사용되지 않는지 봅니다. 재사용은 즉시 평문 노출입니다
  3. 암호문을 검증 없이 복호화하고 있다면 인증 암호(AEAD)로 옮깁니다
  4. 난독화 목적이라면 그 자리를 보안 경계로 세지 않습니다. 키가 같이 배포됩니다
  5. 옛 데이터를 읽어야 해서 남겨야 한다면, 읽기 전용 경로로 격리하고 새로 쓰는 값은 다른 암호로 저장합니다

tools.onuel.dev에 셋이 다 있습니다. RC4는 한 방향 연산으로 암·복호화를 모두 처리하고, SPECK은 64/128 파라미터로, XXTEA는 블록 단위로 동작합니다. 옛 데이터를 열어 보는 용도로 쓰고, 새로 암호화할 값은 AES 쪽에서 다룹니다. 3DES도 같은 성격의 자리입니다.

  • #암호
  • #보안
  • #RC4