스트림 암호(Stream Cipher)란?
스트림 암호는 디지털 데이터 흐름을 한 번에 1비트 또는 1바이트 단위로 암호화하는 방식입니다. 일반적으로 메시지를 블록 단위로 나누지 않고, 그 순간의 1바이트씩 암호화한다는 점이 가장 큰 특징입니다.
대표적인 고전 스트림 암호로는 자동 키(autokey) 비제네르 암호와 버남(Vernam) 암호가 있습니다. 이론적으로는 버남 암호의 일회용 패드(one-time pad) 방식을 활용할 수 있는데, 이 경우 키 스트림을 평문 비트 스트림과 동일하게 취급합니다.
암호학적 키 스트림이 완전히 무작위라면, 이 암호는 키 스트림 자체를 알아내는 방법 외에는 어떠한 수단으로도 해독할 수 없습니다. 다만 키 스트림은 사전에 독립적이고 안전한 채널을 통해 양쪽 사용자 모두에게 전달되어야 합니다.
그러나 전송해야 할 데이터의 양이 매우 많다면 이러한 방식은 감당하기 어려운 물류적 문제를 일으킵니다. 이를 해결하기 위해 비트 스트림 생성기를 알고리즘적 절차로 구현하여, 두 사용자가 각자 암호화 비트 스트림을 생성할 수 있도록 합니다.
이 방식에서 비트 스트림 생성기는 키에 의해 제어되는 알고리즘이며, 암호학적으로 강력한 비트 스트림을 만들어내야 합니다. 이렇게 하면 두 사용자는 생성 키만 공유하면 되고, 각자 필요할 때마다 키 스트림을 만들어 사용할 수 있습니다.
블록 암호(Block Cipher)란?
블록 암호는 평문 블록 전체를 하나의 단위로 처리하여 같은 길이의 암호문 블록을 생성하는 방식입니다. 일반적으로 64비트 또는 128비트 크기의 블록이 사용됩니다. 블록 암호는 메시지를 고정된 크기의 블록으로 나눈 뒤, 한 번에 한 블록씩 변환합니다.
블록 암호는 n비트 평문 블록을 입력받아 n비트 암호문 블록을 출력합니다. 가능한 평문 블록의 종류는 다양하며, 암호화가 가역적(즉, 복호화가 가능)이려면 각 평문 블록이 반드시 고유한 암호문 블록으로 대응되어야 합니다. 이러한 변환을 가역(reversible) 또는 비특이(non-singular) 변환이라고 부릅니다.
블록 암호는 의사 난수 치환(Pseudo Random Permutation, PRP)이라 불리는 수학적 대상에 기반합니다. PRP는 n비트 값 m과 비밀 키 k를 입력으로 받아 n비트 값 c를 출력하는 가역 함수입니다.
PRP는 키 k로 고정했을 때 그 결과 함수가 n비트 값 위에서 정의된 무작위 전단사(bijective) 함수와 구별할 수 없을 때 안전하다고 간주됩니다. 블록 암호는 바로 이러한 안전한 PRP를 수행합니다.
블록 암호는 비밀 키를 사용해 평문 블록을 암호문 블록으로 변환하는 암호화 함수와, 그 역연산을 수행하여 암호문에서 원래의 평문 블록을 복원하는 복호화 함수로 구성됩니다.
스트림 암호와 블록 암호의 핵심 차이
두 암호 방식의 가장 큰 차이는 한 번의 암호화 과정에서 처리하는 데이터의 크기에 있습니다. 스트림 암호는 비트 스트림에서 한 번에 1비트씩 암호화하기 때문에, 암호화된 메시지가 평문 메시지와 비트 대 비트(bit-to-bit)로 일치하는 구조를 갖습니다.
반면 블록 암호는 여러 비트로 이루어진 블록 단위로 데이터를 처리하기 때문에 소프트웨어 구현 효율이 높으며, AES처럼 널리 표준화된 알고리즘이 다양한 보안 시스템에 활용되고 있습니다. 스트림 암호는 구조가 단순하고 속도가 빠른 장점이 있어 실시간 통신이나 제한된 자원의 환경에 적합합니다.