암호는 용어도 많고 알고리즘도 어렵고, 구조도 복잡합니다. 그런 암호 중에서도 블록 암호화를 공부하면 연산 모드란 것을 만나게 됩니다. 어떤 거냐구요? 바로 이런 겁니다. 이런 상수를 만나면 으례 그냥 아무거나 넣거나 디폴트 값을 사용하곤 하지만 오늘은 한 걸음 더 파헤쳐보는 시간을 가져보도록 하겠습니다.
블록 암호화는 기본적으로 블록 단위로 특정 키를 사용해서 암호화를 하는 것을 의미합니다. 특별한 언급이 없는한 대칭키를 사용하는 구조가 대부분이죠. 암호화를 수행한 키를 암호를 해독할 때에도 사용한다는 겁니다. 그렇다면 이런 대칭형 블록 암호화 기법의 가장 큰 문제점은 무엇일까요? 네, 맞습니다. 똑같은 블록, 똑같은 키라면 결과물이 똑같다는 거죠. 어느 정도 패턴이 드러날 수 밖에 없다는 이야깁니다. 아래 이미지를 보면 이해가 빠릅니다. 세 가지 그림이 있는데 왼쪽이 원본, 가운데가 연산 모드 없이(ECB) 블록 암호화를 수행한 것, 오른쪽은 ECB가 아닌 연산 모드를 선택해서 블록 암호화를 수행한 겁니다. 어떤가요? 기본적인 ECB의 경우 이미지가 변형되었지만 우리는 이 이미지가 펭귄이란 것을 인식할 수 있습니다.
이렇게 패턴이 드러나는 문제를 해결하기 위해서 나온 것이 연산 모드입니다. 거창하게 설명했지만 대단한 건 아니고 블록 암호화의 연산 전후에 규칙적으로 변형을 가하는 것을 의미합니다. 아래는 많이 사용하는 CBC 연산 모드에 대한 이미지 입니다.
보면 일반적인 블록 암호화보다 입력 파라미터가 하나 더 있습니다. IV라는 건데요. 직역하면 초기 벡터로 암호에 영향을 주는 또다른 팩터라고 이해를 하면 되겠습니다. CBC 모드를 보면 그냥 블록 암호화를 하는 것이 아니라 암호화를 하기 전에 IV와 XOR을 수행한 다음 그 결과물을 블록 암호화를 시킵니다. 다음 블록의 경우에는 IV가 그 전 블록의 암호화한 결과 값이 됩니다. 따라서 블록 별로 어떤 컨텍스트에서 암호화가 되느냐에 따라 동일한 소스에 동일한 키로 암호화를 하더라도 결과 값이 달라집니다. 그말은 궁극적으로 기본적인 블록 암호화 기법보다 패턴을 알아내기가 훨씬 어려워진다는 걸 의미합니다.
연산 모드를 설명한 위키 페이지를 참고하면 다양한 연산 모드가 소개되어 있으니 한번 살펴보도록 합시다. 연산 모드 설명 옆에 병렬 처리, 랜덤 읽기 지원 여부를 비교해 둔 표도 같이 있으니 함께 살펴보면 더 많은 공부가 될 것 같기도 합니다.