Crypto

스트림암호와 블록암호 [Crypto]

Ohs_ 2020. 2. 20. 14:14

현대 암호로 넘어오게 되면서 암호화의 단위는 알파벳이 아닌 bit단위로 바뀌게 됩니다. 가장큰 이유는 컴퓨터에 대한 보급과 대부분의 통신이 컴퓨터로 이루어지게 되면서 네트워크를 이용한 통신 때의 위험성과 보관된 데이터에 대한 권한이 없는 사용자로 부터 안전하게 보관하기 위해서 등 여러 이유로 암호화를 진행하게 되고 그렇기에 bit단위로 암호화를 하게됩니다. 그 중 해당 bit를 어떻게 나누어 암호화를 하는가 애서 두가지로 나뉘게 됩니다. 바로 스트림암호와 블록암호 입니다. 이번 포스팅에서는 두 가지 방식에 대해 설명을 진행하겠습니다.


 

- 먼저 스트림 암호입니다. 스트림 암호는 암호문과 키의 길이가 동일하여 각각의 암호문과 키값을 이용하여 암호화를 진행합니다. 이러한 스트림 암호의 특징은 평문과 키의 길이가 같고 평문의 길이에 맞춰 키를 생성하면 되기 때문에 패딩이 필요가 없게 됩니다. 앞에. 포스팅한 OTP 에 관한 간단한 설명 처럼 해당 암호의 키값은 난수를 이용하여 생성하게 됩니다. 그렇기에 한번 사용하고 버릴 수 있는 키값을 만들 수 있기 때문에 안전하다고 생각할 수 있지만 컴퓨터가 생성하는 난수는 결국 패턴을 갖게되어 난수처럼 보이지만 결국 반복하게 됩니다. 그렇기에 완벽한 난수를 만들 수 없게 됩니다. 완벽한 난수를 만들 수 있게된다면 매우 안전한 암호화 방식이 될 것입니다.

- 스트림암호의 핵심은 안전한 키의 생성입니다. 이러한 키 생성에 대한 방법은 두가지가 있는데 하나는 비동기식(자기 동기식)입니다. 해당 방법은 평문이나 암호문을 이용하여 키값을 생성하는 방법입니다. 두번째 방법은 동기식 방법입니다. 동기식 방법은 평문이나 암호문에 무관하게 키값을 생성하는 것입니다. 즉 난수값을 발생시켜 해당 난수를 키값으로 이용하는 방법입니다. 동기식 방법에 경우 컴퓨터로 발생시킨 난수를 이용하기 때문에 주기(패턴)이 생기게 됩니다. 당연히 해당 패턴은 길 수록 좋은 키라고 할 수 있습니다. 주기가 짧게 되면 그만큼 키에 대한 패턴에 더 잘보이기 되고 공격자는 키값을 유추하기가 훨씬 쉬워지게 됩니다.

- 키 생성시 일반적인 방법으로 Seed값을 입력받아 키를 생성하는 LFSR(Linear Feedback Shift Register)를 사용합니다. 이름에서도 알 수 있듯이 레지스터이기 때문에 1bit 씩 처리가 가능합니다. 생성 과정은 아래 그림과 같습니다.

LFSR

- 처음 seed값을 4bit 입력 했다면 2^4 - 1 = 15 가 되어 15bit 이후 다시 값이 반복되게 됩니다. LFSR의 주기를 구하는 공식은 2^n - 1 입니다.

- 생성되는 과정은 처음 입력했던 seed값은 그대로 출력되고 첫번째 과정이 시작됩니다. XOR 연산은 두 수가 다를 때 1이 출력됩니다. 그래서 처음 반복때 1과 0을 XOR 연산을 하면 1이 되고 왼쪽으로 한칸씩 밀게 되고 XOR 연산을 한 수는 오른쪽 끝으로 이동하게 됩니다. 이러한 과정을 계속 반복하고 15번째 까지 생성된 수를 보면 처음 seed값으로 입력했던 1010이 다시 출력된 것을 알 수 있습니다. 즉 다시 앞의 숫자들이 반복될 것이라는 것을 예측 할 수 있게됩니다.

 


- 다음은 블록암호 방식입니다. 해당 방식은 평문 또는 암호문을 일정한 길이를 담은 블록으로 나누어 암호화, 복호화를 진행하게 됩니다. 유명한 Des역시 블록암호이며 des는 한 블록이 64bit로 이루어져 암호화가 진행됩니다. 블록암호의 특징은 일정한 블록으로 나누다가 마지막 블록이 일정한 길이를 채우지 못할 경우 패딩(padding)이 필요하게 됩니다. 패딩은 일정한 블록을 채우기 위해 사용되는 bit입니다.

Padding

- 블록암호의 큰 특징중 하나는 키의 재사용 입니다. 앞의 스트림암호가 평문에 길이에 맞게 키값을 생성을 해야됐다면 블록암호는 한 블록의 길이만큼 키를 만들어서 해당 키를 다른 블록을 암호화 할 때 재사용이 가능합니다. 키 생성하는데 있어 매번 어려운 난수를 뽑아내지 않아도 되기 때문에 큰 장점이라고 볼 수 있습니다.

반응형