스트림 암호란 무엇인가?
스트림 암호(stream cipher)는 평문 메시지를 비트 또는 바이트 단위로 하나씩 순차적으로 암호화하는 대칭키 암호 방식입니다. 스트림 암호에는 최소 길이나 최대 길이 제한이 없기 때문에, 어떤 길이의 데이터든 유연하게 처리할 수 있다는 장점이 있습니다.
가장 이상적인 형태의 스트림 암호로는 일회용 패드(one-time pad)를 꼽을 수 있습니다. 일회용 패드에서는 평문과 길이가 같은 키의 일부를 각 메시지마다 사용하며, 한 번 사용된 키 조각은 절대 다시 사용하지 않습니다. 이 규칙을 지키면 이론상 완전한 보안성을 달성할 수 있습니다.
스트림 암호는 어디에 사용되나요?
스트림 암호에서는 암호화 알고리즘이 의사난수(pseudorandom) 키스트림(keystream)을 생성하고, 이 키스트림을 평문과 결합해 메시지를 암호화합니다. 키스트림의 각 비트(또는 바이트)가 평문의 해당 값과 하나씩 차례로 결합되어 암호문이 만들어집니다.
이러한 특성 덕분에 스트림 암호는 속도와 단순성이 모두 중요한 환경에서 특히 유용합니다. 실시간 음성·영상 통신이나 무선 네트워크처럼 데이터가 끊임없이 흐르는 상황에서 많이 활용됩니다.
블록 암호와 스트림 암호의 차이점
블록 암호(block cipher)는 평문을 고정된 크기의 단위(예: 64비트, 128비트 블록)로 나눈 뒤, 키를 사용해 각 블록을 암호문으로 변환하는 방식입니다. 정보를 안전하게 보호하기 위해 데이터를 블록 단위로 묶어 암호화하는 것이 핵심입니다.
반면 스트림 암호는 데이터를 개별 비트 단위로 하나씩 처리하며 평문을 암호문으로 변환합니다. 즉, 두 방식의 가장 큰 차이는 데이터를 다루는 단위에 있다고 할 수 있습니다.
스트림 암호의 종류
스트림 암호는 크게 동기식(synchronous) 방식과 자기동기식(self-synchronizing) 방식으로 분류할 수 있습니다. 다만 대부분의 동기식 스트림 암호가 재동기화(resynchronization) 메커니즘을 갖추고 있어, 자기동기식 스트림 암호가 선택될 필요성은 상대적으로 줄어든 편입니다.
스트림 암호는 얼마나 안전한가?
스트림 암호는 사실상 무한에 가까운 의사난수 비트 스트림을 암호화 키로 사용해 한 번에 1바이트씩 암호화를 수행합니다. 보안 수준을 유지하려면 다음 두 가지 조건이 반드시 충족되어야 합니다.
- 예측 불가능한 의사난수 생성기: 키스트림을 생성하는 난수 생성기는 외부에서 출력값을 추측할 수 없어야 합니다.
- 키 재사용 금지: 동일한 키스트림을 반복 사용하면 보안이 쉽게 무너지므로, 키는 절대 재사용해서는 안 됩니다.
블록 암호와 스트림 암호, 무엇이 더 나은가?
블록 암호는 64비트나 128비트처럼 정해진 크기의 블록 단위로만 데이터를 암호화하는 암호학적 기법입니다. 반면 연속적으로 들어오는 데이터를 암호화할 때는 스트림 암호가 블록 암호보다 더 빠른 성능을 보이는 경우가 많습니다.
따라서 어느 쪽이 무조건 '더 안전하다'기보다는, 처리해야 할 데이터의 성격과 요구되는 속도에 따라 적합한 방식을 선택하는 것이 중요합니다.
스트림 암호의 대표 사례: RC4
RC4는 현대적인 대칭키 스트림 암호의 대표적인 예입니다. RSA 공개키 암호의 개발자 중 한 명인 론 리베스트(Ron Rivest)가 1987년에 개발했으며, ARCFOUR 또는 ARC4라는 이름으로도 널리 알려져 있습니다.
RC4는 선형 피드백 시프트 레지스터(LFSR)를 사용하지 않는 것이 특징이며, 바이트 단위의 평문 문자열에 대해 키스트림을 결합하는 방식으로 동작합니다. 과거에는 SSL/TLS와 무선 보안 프로토콜에서 폭넓게 사용되었으나, 이후 여러 보안 취약점이 발견되어 현재는 새로운 시스템에서의 사용이 권장되지 않습니다.
카운터 기반 스트림 암호: AES-CTR
일부 스트림 암호는 카운터(counter) 값을 암호화하는 방식으로 키스트림을 생성합니다. AES-CTR(AES 카운터 모드)이 대표적인 예로, 암호화된 카운터 값을 통해 키스트림을 만들어내는 유형에 속합니다.
AES는 스트림 암호인가?
AES 그 자체는 블록 암호입니다. 하지만 CTR(카운터) 모드나 OFB 모드와 같은 운영 모드를 적용하면 블록 암호를 스트림 암호처럼 동작하게 만들 수 있습니다. 즉, AES는 기본적으로 블록 암호지만, 사용 방식에 따라 스트림 암호의 성격을 띨 수 있는 셈입니다.