Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

정보 보안 필수 개념, 스트림 암호(Stream Cipher)란?

스트림 암호(Stream Cipher)의 기본 개념

스트림 암호는 평문(plaintext)에 시간적으로 변화하는 변환을 적용해 연속적인 이진 비트열을 암호화하는 방식입니다. 이러한 암호화는 비트(bit) 단위로 수행되며, 키스트림(keystream)을 이용해 길이에 제한 없는 평문 메시지를 암호문(ciphertext)으로 변환합니다.

구체적으로 살펴보면, 스트림 암호는 128비트 또는 256비트 크기의 키(key)와 64~128비트 크기의 논스(nonce)를 결합하여 키스트림을 생성합니다. 이렇게 만들어진 의사난수(pseudorandom number)가 평문과 XOR 연산을 거치면서 최종 암호문이 완성됩니다.

키와 논스는 재사용이 가능하지만, 보안을 위해 키스트림은 암호화할 때마다 반드시 고유해야 합니다. 스트림 암호는 피드백 시프트 레지스터(feedback shift register)를 활용해 단 한 번만 사용되는 고유한 논스(nonce, number used once)를 만들어내고, 이를 바탕으로 키스트림을 생성합니다.

스트림 암호의 특징

스트림 암호를 적용한 암호화 방식은 오류가 시스템 전체로 전파될 가능성이 낮습니다. 한 비트의 변환 과정에서 오류가 발생하더라도 일반적으로 전체 평문 블록에는 영향을 미치지 않기 때문입니다.

또한 스트림 암호는 선형적이고 연속적인 방식으로 동작하기 때문에 구현이 비교적 간단하고 처리 속도도 빠른 편입니다. 다만 각 평문 비트가 하나의 암호문 출력에 일대일로 대응되는 구조 특성상 확산(diffusion) 기능이 부족하다는 한계가 있습니다.

더욱이 스트림 암호는 자체적으로 인증(authenticity) 기능을 제공하지 않기 때문에 삽입 공격에 취약할 수 있습니다. 해커가 암호화 알고리즘을 분석하는 데 성공하면, 탐지되지 않은 상태에서 암호문을 추가하거나 변조할 위험이 존재합니다.

키스트림(Keystream)의 작동 원리

스트림 암호는 평문의 양을 미리 예측할 수 없는 응용 프로그램이나 낮은 지연 시간(latency)이 요구되는 환경에서 데이터를 암호화하는 데 널리 활용됩니다. 여기서 핵심적인 역할을 담당하는 것이 바로 '키스트림'입니다.

키스트림은 키를 의사난수 비트 생성기(pseudorandom bit generator)에 입력했을 때 출력되는 무작위 8비트 값을 의미합니다. 생성된 8비트 출력, 즉 키스트림은 해당 스트림 암호 알고리즘에서 정보의 암호화와 복호화 과정 모두에 사용됩니다.

비트스트림 생성기는 반드시 알고리즘적 절차로 구현되어야 하며, 그래야만 두 사용자가 동일한 암호학적 비트스트림을 만들어낼 수 있습니다. 이 방식에서 비트스트림 생성기는 키로 제어되는 알고리즘이며, 암호학적으로 강력한 비트스트림을 생성해야 합니다. 결과적으로 두 사용자는 생성 키만 공유하면 되고, 각자 독립적으로 키스트림을 만들어 사용할 수 있습니다.

스트림 암호의 장점

  • 잘 설계된 의사난수 생성기를 사용하면 스트림 암호는 동일한 키 길이를 가진 블록 암호(block cipher)만큼 안전할 수 있습니다.

  • 블록 암호를 구성 요소로 사용하지 않는 스트림 암호는 일반적으로 블록 암호보다 속도가 빠르고 코드량이 훨씬 적다는 점이 가장 큰 강점입니다.

  • 데이터 통신 채널이나 브라우저·웹 링크처럼 데이터 스트림을 지속적으로 암호화/복호화해야 하는 응용 프로그램이라면 스트림 암호가 더 나은 선택이 될 수 있습니다.

  • 반면 파일 전송, 이메일, 데이터베이스처럼 데이터 블록을 다루는 응용 분야에서는 블록 암호가 더 적합할 수 있습니다.

  • 그럼에도 불구하고 이 유형의 암호는 사실상 어떤 응용 프로그램에서든 활용이 가능합니다.