정보의 원래 의미를 파악할 수 없도록 일정한 알고리즘을 통해 변환하는 과정을 암호화라고 합니다. 암호화의 역사는 컴퓨터의 등장보다 훨씬 이전부터 시작되었습니다. 전쟁에서 이기려면 아군의 정보가 적에게 누설되지 않도록 보호하는 것이 필수였기 때문입니다.
고대 스파르타에서는 위 사진과 같은 나무 막대를 이용해 군사 기밀을 전달했다고 합니다. 나무 막대를 스키테일이라고 불렀기 때문에 일명 스키테일 암호화라고 하는데요. 방법은 다음과 같습니다.
단순한 방식이지만 암호학의 주요 개념을 모두 담고 있습니다. 차근차근 살펴보도록 합시다.
스파르타 병사가 암호화된 편지를 전달하려다가 아테네 군에 붙잡혔다고 가정해봅시다. 아테네 군은 양피지에 적힌 메시지를 열심히 읽어보겠지만, 원래의 뜻을 알 수 없을 것입니다.
스키테일 암호화는 암호화와 복호화의 키가 모두 ‘스키테일의 굵기’ 였습니다. 이처럼 암호화와 복호화가 같은 키를 사용하는 암호화 방식을 ‘대칭키(symmetric-key) 암호화라고 합니다. 다시 붙잡힌 스파르타 병사의 이야기로 돌아가 대칭키 암호화의 장단점을 알아보도록 하겠습니다.
아테네 병사 중 한 명이 스키테일 암호화에 대해 들어본 적이 있다고 합시다. 이 병사가 직접 나무 막대를 만들어서 양피지를 감아보면 어떨까요? 붙잡힌 병사가 사용하던 것과 같은 굵기가 아니라면 복호화가 불가능합니다. 암호화 알고리즘이 알려졌는데도 복호화 키인 스키테일이 없어 안전한 것입니다.
단 스파르타 병사가 복호화에 필요한 스키테일을 함께 전달하려다 붙잡힌 것이라면 이야기가 달라집니다. 병사 중 한 명이 알고리즘에 대해 알고 있으므로 스키테일을 탈취하는 순간 편지를 복호화 할 수 있을 것입니다. AES와 같은 현대의 대칭키 알고리즘은 스키테일보다 훨씬 복잡한 암호화 방법을 사용하지만, 중간에 탈취 당하면 끝이라는 근본적인 약점을 극복하지는 못했습니다.
암호화 통신을 하려면, 최초 한 번 만큼은 상대방에게 암호화 알고리즘과 키를 전달하여야 합니다. 키를 전달 과정에서 탈취 당했다면 이후의 통신은 평문으로 보내는 것이나 다름 없게 됩니다. 나아가 적군이 탈취한 스키테일로 거짓 메시지를 작성해 혼란을 가져올 수 있습니다.
이런 위험이 있는 대칭키 암호화를 사용하는 이유는, 다음에 소개할 비대칭키 암호화보다 훨씬 빠른 속도로 암호화 및 복호화를 해낼 수 있기 때문입니다. 암호화 키를 전달 할 때만 안전한 알고리즘으로 보호하고, 나머지 통신은 대칭키 알고리즘을 통해 암호화 하는 방식을 많이 사용합니다.
반대로 암호화에 사용하는 키와 복호화에 사용하는 키가 다른 ‘비대칭키 암호화’도 있습니다. 비대칭키 암호화에서는 키 한 쌍을 함께 사용하는데요. 이 키를 각각 공개키와 개인키라고 합니다. 공개키와 개인키는 서로를 통해서만 복호화 할 수 있습니다. 즉 공개키로 암호화한 메시지는 개인키를 사용해 복호화 해야 하고, 개인키로 암호화한 메시지는 공개키를 사용해 복호화 해야 합니다.
수신자는 ‘나에게 메시지를 보낼 때는 이 키를 통해서 암호화 하라’며 송신자에게 공개키를 전달합니다. 이때 공개키를 전달하는 과정에서 누군가가 가로채거나 훔쳐보더라도 개의치 않습니다. 스키테일을 뺏길까봐 전전긍긍 하던 스파르타 병사의 모습을 생각하면 놀라운 일인데요. 통신 과정을 살펴보면서 어떻게 이런 일이 가능한지 알아봅시다.
해커가 중간에 패킷을 가로채봤자, 수신자의 공개키와 암호문만을 얻을 수 있습니다. 정작 복호화에 필요한 개인 키는 수신자만 가지고 있기 때문에 메시지 해독이 불가능 합니다. 메시지 해독을 하려면 수신자의 컴퓨터에 직접 침투해서 개인키를 얻는 방법 밖에는 없는데요. 이는 패킷을 가로채는 것 보다 훨씬 어려운 일입니다. 스키테일을 전달하던 병사를 붙잡는 것보다 적진에 쳐들어가서 뺏는 것이 더 어려운 것과 같은 이치입니다.
앞서 대칭키 암호화를 설명할 때, 암호화 키를 탈취 당하면 암호문의 내용을 적에게 들킬 뿐만이 아니라 거짓 메시지에 속는 일도 생길 수 있다고 했습니다. 비대칭키 알고리즘을 이용하면 거짓 메시지에 속는 일도 방지할 수 있습니다. 비대칭키 알고리즘을 이용한 통신 과정을 단계 별로 살펴보면 다음과 같습니다.
a. 공개키
b. 개인키를 이용해 암호화 한 메시지
수신자는 공개키로 메시지의 복호화를 시도 합니다. 복호화의 결과에 따라 다음과 같이 판단합니다.a. 성공: 메시지는 송신자가 보낸 것이 맞습니다.
b. 실패: 메시지는 송신자인 척 연기하는 다른 누군가가 보낸 것입니다.
복호화에 실패하면 왜 위조된 메시지로 볼 수 있는걸까요? 해커가 패킷을 훔쳐보더라도 암호화에 사용한 송신자의 개인키를 알 방법이 없습니다. 따라서 거짓 메시지를 암호화 하려면 자신이 소유한 다른 개인키를 사용하는 수 밖에 없습니다. 이렇게 암호화 한 메시지는 송신자의 공개키로 암호화 할 수 없으므로 위조 사실이 들키게 되는 것입니다.
마지막으로 복호화가 불가능한 ‘단방향 암호화’ 가 있습니다. 단방향 암호화를 이해하려면 먼저 ‘해시 함수’의 개념을 알아야 합니다. 해시 함수란 인자로 무엇을 설정하건 함숫값의 크기가 일정한 함수를 말합니다. 예를 들어 단방향 암호화 알고리즘 중 널리 사용되는 sha-256은 인자의 길이와 상관없이 32바이트의 해시값을 반환합니다. 이 함수의 인자를 평문으로 주고 반환된 문자열을 암호문으로 사용하는 것이 단방향 암호화입니다.
해시 함수도 수학적 함수의 일종이므로, 인자가 같으면 함숫값도 같습니다. 그러나 함숫값을 보고 인자가 무엇이었는지 알아내는 것은 불가능합니다. 즉 평문이 같으면 암호문도 같지만, 암호문을 보고 평문이 무엇이었는지 알아내는 것은 불가능합니다. 두 가지 문자열을 암호화하는 예시를 통해 살펴봅시다.
F903118960A7FF1FC5948220EBDF60AD3AEE8AC9884736891A0C7944EDA57244
Whatap Labs13BB3932FD59710CECA3FBC421CD3C344864341C3A585000268A9FC9B1DB7566
‘WhatapLabs’와 ‘Whatap Labs’의 차이는 중간의 스페이스 하나 뿐입니다. 그런데 결과로 나오는 문자열은 전혀 다릅니다. 이처럼 조그만 차이에도 결과가 달라지는 것을 ‘눈사태’ 효과라고 하는데요. 암호화에 사용하는 해시 함수들은 눈사태 효과가 매우 강하게 일어납니다.
어떤 사용자가 패스워드를 ‘WhatapLabs’ 라고 설정했다고 가정해봅시다. 평문을 그대로 데이터베이스에 저장한다면 유출시 사용자의 피해가 매우 커집니다. 대신 해시값 ‘F90311…’을 저장한다면 유출 사고가 생기더라도 복호화 할 수 없어 피해가 제한됩니다. 다행히 로그인 기능 구현에도 지장이 없습니다. 로그인 하려는 사용자가 입력한 패스워드의 해쉬값이 ‘F90311….’ 와 일치하면 로그인 성공, 그렇지 않으면 로그인 실패로 처리합니다.
주의할 점은 단방향 암호화를 사용한다고 해서 약점이 전혀 없는 것은 아니라는 것입니다. 서로 다른 인자의 해시 함숫값이 같은 현상을 ‘충돌’이라고 하는데요. 충돌을 발생시키는 방법이 알려지면 패스워드를 복호화 한 것과 같은 효과를 얻을 수 있습니다. 예를 들어 웹 사이트에서 사용하는 해시 함수가 인자 ‘WhatapLabs’와 ‘Monitoring’ 에 대해 같은 함숫값을 반환한다고 가정해봅시다. 해커는 WhatapLabs라는 평문을 알지 못해도 ‘Monitoring’이라는 패스워드를 입력해 로그인할 수 있게 됩니다.
앞서 소개한 sha-256 같은 안전한 알고리즘은 해시 충돌이 발생하는 경우의 수가 아직 발견되지 않았습니다. 반면 md5나 sha-1 과 같은 오래된 알고리즘은 충돌이 발생하는 경우가 알려져 있기 때문에 패스워드와 같은 민감한 정보를 암호화 할 때는 절대 사용하면 안 됩니다.
오늘은 정보 보호에 사용하는 암호화 방식을 개략적으로 소개했습니다. 현재의 네트워크 환경에서는 암호화가 쓰이지 않는 구간이 거의 없다고 해도 과언이 아닌데요. 다음 편부터는 암호화 알고리즘의 구체적인 사용 사례를 살펴보겠습니다.