스트림 암호 (Stream Cipher)

핵심 인사이트 (3줄 요약)

  1. 본질: 스트림 암호는 평문과 동일한 길이의 의사 난수 키 스트림 (Keystream)을 생성하고, 이를 평문과 XOR하여 암호문을 생성한다. 블록 암호가 고정 크기 블록을 처리하는 것과 달리, 스트림 암호는 비트/바이트 단위로 실시간 처리한다.
  2. 가치: 속도가 매우 빠르고 지연이 적어 음성/영상 통신, 실시간 데이터 스트리밍 등 지연에 민감한 애플리케이션에 적합하다. RC4는 취약점으로 인해 폐기되었으며, ChaCha20이 현대적 대안으로 권장된다.
  3. 한계: 키 스트림의 품질이 보안의 핵심이며, 키를 두 번 이상 사용하면 치명적 보안 문제가 발생한다. 또한 일부 스트림 암호는 일부国家安全기관의 수준에서는破られた可能性が指摘されている。

Ⅰ. 개요 및 필요성

개념 정의

**스트림 암호 (Stream Cipher)**는 다음과 같이 정의된다:

  • 키 스트림 생성: 의사 난수 생성기 (PRNG)로 평문과 길이가 같은 키 스트림 생성
  • XOR 연산: 평문 비트/바이트와 키 스트림을 XOR하여 암호문 생성
  • 실시간 처리: 블록 단위가 아닌 연속적인 데이터 스트림을 처리

동작 원리:

【암호화】
키 스트림:  K = k1, k2, k3, ...
평문:        M = m1, m2, m3, ...
암호문:      C = m1⊕k1, m2⊕k2, m3⊕k3, ...

【복호화】
암호문:      C = c1, c2, c3, ...
키 스트림:   K = k1, k2, k3, ...  (동일한 키로 재생성)
평문:        M = c1⊕k1, c2⊕k2, c3⊕k3, ...

필요성

스트림 암호가 필요한 이유:

  1. 실시간 통신: 음성, 영상通话 등 지연에 민감한 애플리케이션
  2. 하드웨어 효율성:低端嵌入设备에서 효율적 구현 가능
  3. 에러 전파 없음: 블록 암호와 달리 에러가 다른 블록에 영향 없음
  4. 처리 순서: 데이터 시작을 알 필요 없이 언제든지 처리 가능

비유

스트림 암호는 물 흐르는 관에서의 순간 순간 섞는 장치와 같다. 물이 흐르는 동안 미세한 잉크 방울을 섞어 아무도 물의 원래 색을 알 수 없게 만드는 것이다. 관의 특정 지점에서 샘플을捕まえとしても既に流れ去ってしまった、誰も知らない。

📢 비유: 스트림 암호는 "계곡의 물에 가는 잉크를 떨어뜨리는 것"과 같다. 물이 흐르는 한 계속해서 다른 위치에서 다른 양의 잉크가 섞여 들어가기 때문에, 어느 순간 하나의 샘플을捕まえて도 원래 물이 어떤 색이었는지 알 수 없다. 하지만 만약 같은 장소에 같은 양의 잉크를 다시 떨어뜨리면 (키 재사용), 패턴이 발견될 수 있다.

등장 배경

스트림 암호의 역사는 고대로부터 시작된다:

  • 1940년대: Gilbert Vernam이 OTP (One-Time Pad) 아이디어 제안
  • 1987년: RC4 (Rivest Cipher 4) 개발, 후일 WEP에서 널리 사용
  • 2000년대: RC4의 심각한 취약점 발견, 사용 중지
  • 2008년: ChaCha20 (Daniel J. Bernstein 개발)이 공개
  • 2014년: TLS 1.3에서 ChaCha20-Poly1305 표준 채택
  ┌────────────────────────────────────────────────────────────────────┐
  │                    스트림 암호 vs 블록 암호                           │
  ├────────────────────────────────────────────────────────────────────┤
  │
  │  【스트림 암호】                                                     │
  │  ┌──────────────────────────────────────────────────────────────┐  │
  │  │                                                              │  │
  │  │  평문:   b1   b2   b3   b4   b5   b6   ...                  │  │
  │  │           ↓    ↓    ↓    ↓    ↓    ↓                       │  │
  │  │  키스트림: k1   k2   k3   k4   k5   k6   ...                │  │
  │  │           ↓    ↓    ↓    ↓    ↓    ↓                       │  │
  │  │  암호문:  c1   c2   c3   c4   c5   c6   ...                │  │
  │  │         (xor) (xor) (xor) (xor) (xor) (xor)                  │  │
  │  │                                                              │  │
  │  │  - 비트/바이트 단위 처리                                       │  │
  │  │  - 지연 없음 (실시간)                                         │  │
  │  │  - 에러가 전파되지 않음                                        │  │
  │  └──────────────────────────────────────────────────────────────┘  │
  │
  │  【블록 암호 (CBC 모드)】                                          │
  │  ┌──────────────────────────────────────────────────────────────┐  │
  │  │                                                              │  │
  │  │  평문:   P1    P2    P3    P4                                │  │
  │  │          │     │     │     │                                 │  │
  │  │          ↓     ↓     ↓     ↓                                 │  │
  │  │  키:    K1    K2    K3    K4                                 │  │
  │  │          │     │     │     │                                 │  │
  │  │          ↓     ↓     ↓     ↓                                 │  │
  │  │  암호문: C1    C2    C3    C4                                │  │
  │  │                 ↑     ↑     ↑                                 │  │
  │  │               IV    이전 C의존                                 │  │
  │  │                                                              │  │
  │  │  - 블록 단위 처리 (128비트 등)                                │  │
  │  │  - 지연 발생 가능                                             │  │
  │  │  - 에러가 다음 블록에 영향                                    │  │
  │  └──────────────────────────────────────────────────────────────┘  │
  │
  └────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 스트림 암호와 블록 암호는 다음과 같은 근본적 차이가 있다. 스트림 암호는 각 비트를 개별적으로 처리하여 XOR 연산으로 바로 암호화하므로 실시간 처리가 가능하다. 반면 블록 암호는 일정량의 데이터를 모아서 블록으로 처리하므로 지연이 발생할 수 있다. 그러나 가장 중요한 차이는 키 스트림의 품질이다. 스트림 암호의 보안은 생성되는 키 스트림이 실제로 무작위인지에完全依存한다. RC4가 취약한 것도 키 스트림의초기 部分に予測 가능성이发现问题されたためだ.


Ⅱ. 아키텍처 및 핵심 원리

주요 스트림 암호 알고리즘

1. RC4 (Rivest Cipher 4)

  • 설계: Ron Rivest, 1987년
  • 구조: 내부 상태 기반 의사 난수 생성
  • 문제점: 키 스트림 초기에 취약점, 예측 가능성
  • 현재: WEP, SSL/TLS에서 사용 중지

2. ChaCha20

  • 설계: Daniel J. Bernstein, 2008년
  • 구조: ARX (Add-Rotate-XOR) 기반
  • 특징: 단순하고 효율적,侧面 채널攻撃에強い
  • 용도: TLS 1.3, Signal Protocol

3. Salsa20

  • 설계: Daniel J. Bernstein, 2005년
  • 특징: ChaCha20의 전신
  • 현재:徐々に ChaCha20으로 대체

ChaCha20의 구조

ChaCha20의 핵심은 Quarter Round 연산이다:

【ChaCha20 Quarter Round】
a, b, c, d = 输入值
a += b; d ^= a; d = rotate_left(d, 16)
c += d; b ^= c; b = rotate_left(b, 12)
a += b; d ^= a; d = rotate_left(d, 8)
c += d; b ^= c; b = rotate_left(b, 7)

【ChaCha20 전체 구조】
1. 초기 상태 설정 (key, nonce, counter)
2. 20 라운드 (각 라운드는 4 Quarter Round)
3. 상태를 행렬로 변환
4. 키 스트림 生成

키 재사용의 위험

스트림 암호에서 키 재사용은 치명적이다:

【키 재사용 시 문제】

키 스트림 K를 두 번 사용:
암호문1: C1 = P1 ⊕ K
암호문2: C2 = P2 ⊕ K

두 암호문을 XOR:
C1 ⊕ C2 = (P1 ⊕ K) ⊕ (P2 ⊕ K) = P1 ⊕ P2

→ 키가 상쇄되어 평문의 XOR가丸見え!

📢 아날loga: 스트림 암호의 키 재사용은 "물에 두 번 섞인 잉크"와 같다. 처음에 섞인 잉크의 양을 몰라도, 두 번 같은 양이 섞이면 어떤 위치에서浓淡が検出できる。第二次のインクが消去されると第一次のインクの色が推測できてしまう 것처럼、暗号解読의 길이 열린다.


Ⅲ. 융합 비교 및 다각도 분석

스트림 암호 vs 블록 암호

구분스트림 암호블록 암호
처리 단위비트/바이트블록 (64/128비트)
속도매우 빠름빠름
에러 전파없음다음 블록에 영향
하드웨어단순복잡
키 관리동일 키 재사용 불가상대적으로 관용
주 용도실시간 통신대용량 데이터

ChaCha20 vs RC4

구분RC4ChaCha20
무작위성취약우수
초기 벡터예측 가능예측 불가능
** Attacks**다수 발견目前까지strong
권장 여부비권장권장
성능빠름SIMD 가속으로高速

AEAD 스트림 암호

현대 스트림 암호는 인증을附加한다:

ChaCha20-Poly1305:

  • ChaCha20: 암호화
  • Poly1305: 메시지 인증
  • AES-GCM과 comparable한安全性提供

Ⅳ. 실무 적용 및 기술사적 판단

권장 구성

TLS 1.3에서의 스트림 암호:

CipherSuite: TLS_CHACHA20_POLY1305_SHA256
- ChaCha20: 256비트 키, 64비트 nonce, 64비트 counter
- Poly1305: 일회성 키로 각 메시지 인증
- 1-RTT 핸드셰이크와 결합

Signal Protocol:

X3DH (Extended Triple Diffie-Hellman):
- Curve25519로 키 교환
- ChaCha20-Poly1305로 메시지 암호화
- 축적된 키를 사용하여 전방 비밀성 제공

안티패턴

  • RC4 사용: 이미破られた 알고리즘을 사용하면安全ではない
  • 키 재사용: 스트림 암호에서 키 재사용은絶対に避ける
  • ** Predictable IV**: 초기화 벡터가 예측 가능하면 키 스트림이暴露될 수 있다
  • 独自 스트림 암호: 검증되지 않은 자체 알고리즘 开发는 위험

선택 가이드

  • 모바일 환경: ChaCha20-Poly1305 권장 (AES보다高速な場合がある)
  • 하드웨어 가속 있을 때: AES-GCM 권장 (AES-NI 활용)
  • 저전력 환경: ChaCha20 권장
  • ** максимальная безопасность**: AES-256-GCM 권장

Ⅴ. 기대효과 및 결론

ChaCha20의 성능 이점

환경AES-GCMChaCha20-Poly1305
데스크톱 (AES-NI)매우 빠름빠름
모바일 (ARM)보통빠름
IoT (소형 MCU)低速빠름
SIMD 가속매우 빠름매우 빠름

미래 전망

  • ChaCha20 확산: TLS 1.3 채택으로 ChaCha20 사용 증가
  • 레거시 대체: RC4를 완전히 제거하고 ChaCha20/AES-GCM로 대체
  • 양자 컴퓨터 위협: Grover 알고리즘으로 256비트 키면十分

📢 정리: 스트림 암호는 실시간 통신에 적합한高速な暗号システム이다. RC4는 이미破られたため使用禁止이며, ChaCha20이 현대적 대안으로 권장된다. 키 재사용은 치명적 보안 문제를 유발하므로 절대 피해야 하며, 인증을附加한 ChaCha20-Poly1305 또는 AES-GCM 사용을 권장한다.


📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
ChaCha20ARX 기반의 현대적 스트림 암호로, RC4를 대체하며 TLS 1.3에서 사용된다
Poly1305메시지 인증 코드로, ChaCha20과 결합하여 AEAD를実現한다
키 스트림의사 난수로 생성된 키와 XOR할 데이터 스트림
RC4레거시 스트림 암호로 취약점이 발견되어 사용 중지
Signal ProtocolChaCha20-Poly1305를活用한 안전한 메시징 프로토콜
양자 컴퓨터 위협Grover 알고리즘으로 ChaCha20도 강도가 半감하지만 256비트는十分である

👶 어린이를 위한 3줄 비유 설명

  1. 스트림 암호는**"계속 흐르는 강물에 색소를 섞는 것"**과 같아. 물이 흐름에 따라 계속해서 다른 위치에서 다른 색소가 섞여 들어가기 때문에, 어느 한 위치의 샘플을 떠도 원래 물이 무슨 색이었는지 절대 알 수 없어.
  2. 중요한 건**"같은 색소를 두 번 섞으면 안 된다"**는 거야. 이번에는 赤, 다음에는 緑를 섞으면 도둑이 "赤색 성분이 있다"는 것을알게 되고, 이것을 이용하면 원래 물의 색을 짐작할 수 있게 돼.
  3. 컴퓨터에서도 마찬가지로 ChaCha20은 "계속 변하는新しい 색소"를 만들기 때문에 안전하지만, 옛날 RC4는 "일정한 패턴의 색소"를 만들어서 도둑이 예측할 수 있게 되어버린 거야!