암호화란 무엇이며 어떻게 작동할까?
오늘날 암호화 기술은 가장 간단한 응용프로그램(앱)에도 사용되어진다. 너무나도 쉽게 온라인 해킹이 일어나는 현대에서, 암호화 기술을 비롯한 기타 유형의 암호 방식은 정보를 보호할 수 있는 최고의 도구이다.
대부분의 응용프로그램(앱)과 프로그램은 암호화 기술을 사용한다. 최고의 VPN 서비스들은 256 bit 키의 AES를 사용하며, 이 때문에 VPN은 온라인 활동을 보호하는 최고의 방법으로 간주된다.
왓츠앱(WhatsApp)이나 지메일 등 다른 인기 앱 역시 암호화 기술을 사용 중이다.
대부분의 사람들이 일상에서 특정 유형의 암호 방식을 사용하고 있지만, 대부분이 암호 방식의 작동 원리에 대해서는 전혀 알지 못한다.
오늘 이 포스트에서는 암호 방식의 작동 원리를 이해하기 위해, 한 가지 실례를 살펴보려 한다.
오픈채널과 관련된 문제
메시지를 주고 받으며 소통할 수 있는 일반적인 온라인 채팅방을 떠올려보자. 암호화된 메시지로 보안된 채팅방을 생성할 수 있는 원리는 무엇일까?
첫번째 시행은 간단한 TCP 기반의 통신 채널이다. 여기에는 따로 보안이 없기 때문에, 사용자가 전송하는 모든 메시지는 무방비 상태로 공격에 노출된다.
예로 철수와 영희라는 두 사람이 서로에게 메시지를 보낼 때, 공격자들은 간단하게 그들의 대화를 엿볼 수 있는 것이다. 이를 전문 용어로 중간자 공격(a Man in the Middle attack)이라고 한다. 또, 해커들은 이 두 사람의 메시지를 변경하고 재라우팅할 수도 있다.
이가 가능한 이유는 기본 설정된 통신 채널이 메시지들을 암호화하지 않은 데이터 형식인 평문으로 전달하기 때문이다. 이러한 위험에 노출되기는 공개 와이파이 네트워크를 통해 이루어지는 모든 HTTP 통신도 마찬가지다. 이보다는 나은 시스템이 필요한 것은 명확하다.
대칭 암호
대칭 암호는 암호 키를 사용해 원래의 평문 메시지를 암호문으로 이루어진 암호 메시지로 변경하는 알고리즘을 사용한다. 수취인은 동일한 키를 사용해 암호문을 평문으로 다시 변경한다. 이 과정을 실례로 살펴보자.
영희는 철수에게 메시지를 보내고 싶어 메시지를 대칭 키를 사용해 암호화했다. 철수가 해당 메시지를 받았을 때, 동일한 대칭 키를 사용해 메시지를 해독한다. 공격자들은 철수와 영희가 사용한 대칭 키 없이는 이 둘 사이에 오간 암호화된 메시지에 접근할 수 없다. 둘 사이의 대화가 비밀스럽게 유지된 것이다.
일반적으로 대칭 키는 세션 마다 생성되며 이후 통신에는 유효하지 않다. 이 때문에 대칭 키는 세션 키라고도 불린다.
하지만 이 방식에는 단점이 따른다:
- 확장성: 이 방식은 확장성이 떨어진다. 1,000명의 사용자가 서로 대화를 나눈다고 가정해보자. 안전한 통신 채널 형성을 위해, 각 사용자는 999개의 서로 다른 키가 필요하다.
- 키 분배: 이 방식에는 양 당사자가 대칭 키에 접근할 수 있다는 가정이 전제되어 있다. 하지만, 애초에 어떻게 당사자가 이 대칭 키를 가질 수 있을까? 만약 영희가 대칭 키(세션 키)를 생성해 철수에 보내면, 공격자는 이 과정에서 키를 가로채고 앞으로 발생하는 대화를 해독할 수 있다.
그렇다면, 이를 해결할 방법은 없을까?
비대칭 암호
비대칭 암호는 개인 키와 공개 키 총 두 개의 키를 사용한다. 평문은 공개 키로 암호화되고, 암호화된 메시지는 이에 상응하는 개인 키로 해독된다.
이 방식을 이용하면 대칭 키의 두 가지 문제를 해결할 수 있다. 비대칭 암호 방식은 대칭 암호 방식보다 느리기 때문에, 이 두 방식은 보통 함께 사용되어진다. 그 방법을 살펴보자.
모든 사용자는 공용 키와 개인 키를 한 쌍씩 갖고 있다. 공개 키는 모두가 알고 있고 사용할 수 있는 키인 반면, 개인 키는 각 사람이 소유하고 보호하는 비밀 키이다.
영희가 철수에게 메시지를 보낼 때, 영희는 먼저 대칭 세션 키를 생성한다. 그리고 영희는 철수의 공개 키로 이를 암호화한다. 철수는 이에 상응하는 개인 키를 가지고 있으므로, 철수는 영희가 보낸 메시지를 해독하고 세션 키를 얻을 수 있다.
여기서부터 세션 키는 이 둘 사이의 메시지를 암호화하고 해독하는 데 사용된다. 이로써 속도가 느려지지 않으면서, 키 분배 문제 역시 해결할 수 있다. 이는 상대적으로 속도가 느린 비대칭 암호 방식을 첫 메시지 교환에서만 사용하기 때문이다.
이 방식으로 확장성의 문제도 해결할 수 있는데, 그 이유는 모두가 대화를 나누기 위해 오직 한 쌍의 공개 키와 개인 키가 필요하기 때문이다.
이제 방식으로 시스템이 훨씬 향상되었다. 하지만 여전히 완벽한 보안을 이룬 것은 아니다. 현 시스템에서는 여전히 다음 두 가지 문제가 발생한다.
- 인증: 위의 실례에서 우리는 철수의 공개 키를 출발점으로 삼고 있다. 하지만, 애초에 이 공개 키를 어떻게 얻을 수 있었을까? 최초의 공개 키는 철수가 제공한 걸 수도 있지만, 철수인 척 위장한 공격자가 제공한 것일 수도 있다. 이 상황이 발생하면 보완된 통신을 잘못된 사람과 주고받을 수 있는 것이다.
- 데이터 무결성: 해당 메시지는 데이터 전송 중에 변경될 수 있다. 데이터가 중간에 조작되지 않도록 확실히 해야한다.
인증서 & 디지털 서명
인증에는 신뢰할 수 있는 시스템이 필요하다. 신뢰할 수 있는 인증 기관(CA, Certificate Authority)은 각 공개 키가 특정 사람에게만 속하도록 한다. 이 시스템의 각 사용자는 디지털 인증서를 인증 기관에서 등록한다. 이 인증서에는 소유자의 신원 정보와 공개 키가 포함된다.
그래서 영희가 철수와 대화를 원할 때, 인증 기관에 영희가 받은 공개 키가 정말로 철수에게 속한 것인지 확인할 수 있다. 이 방식은 인터넷 상에서의 HTTPS 작동 원리이기도 하다. 하나의 최상위 인증서는 여러 하위 인증서와 연결되어 있는데, 이때 디지털 서명을 사용한다. (아래 자세히 설명되어 있으니 참고하길 바란다)
그렇다면, 여기서 받은 인증서가 공격자가 아닌 최상위 인증 기관이 제공한 것이라는 것을 어떻게 알 수 있을까? 먼저, 신뢰할 수 있는 인증 기관으로부터 온 최상위 인증서는 해당 브라우저에서 하드코딩되기 때문에 믿을 수 있는 기준선을 제시한다.
데이터 무결성 문제는 디지털 서명을 사용하여 해결할 수 있다. (여기서 디지털 서명을 디지털 인증서와 혼동하지 않도록 주의를 기울여야한다)
영희가 철수에 메시지를 보내고 싶을 때, 먼저 영희는 세션 키를 생성하고 이를 철수의 공개 키로 암호화한다. 이 데이터 패킷을 파트1이라 칭하자. 그후, 영희는 수많은 사용 가능한 해싱 알고리즘 (MD5/SHA256) 중 하나를 사용해 메시지 해시를 생성한다. 메시지 해시란 다양한 길이의 바이트(byte)를 고정된 길이의 바이트로 변환하는 일방 변환 방식이다.
해시 값으로부터 원래 메시지를 얻을 수 없으며, 두 메시지가 동일한 해시 값을 갇기란 통계상으로는 불가능하다.
해시 생성 후, 영희는 이를 자신의 개인 키로 암호화한다. 이를 디지털 서명이라 부른다. 이 디지털 서명으로 영희로부터 메시지가 전송되었으며, 해당 메시지가 조작되지 않았음을 확인할 수 있다.
다음으로 이 디지털 서명과 원문 메시지는 세션 키로 암호화된다. 이 작업을 파트 2라 부르자. 이제 다음 두 가지 사항이 준비되어 있다:
파트 1 = 철수_공개_키 -> (세션_키)
파트2 = 세션_키 -> (메시지 + 디지털_서명)
영희는 파트1과 파트2를 철수에 보낸다. 철수만이 개인 키를 가지고 있으므로, 오직 철수만이 파트1을 해독하고 세션_키를 얻을 수 있다.
다음으로 철수는 이 세션 키를 사용해 파트 2를 해독하고 해당 메시지와 디지털 서명을 회수한다. 그후, 철수는 영희의 공개 키를 사용해 디지털 서명을 해독하고 메시지 해시를 회수한다. 철수는 메시지 해시를 계산해 이를 이 전 단계에서 온 메시지 해시와 비교한다.
이때, 두 개의 해시가 부합한다면 중간에 조작이 일어나지 않고 데이터 무결정이 보존되었음을 뜻한다.
이제, 완벽한 보안 시스템이 완성되었다.
인증서와 디지털 서명을 사용해 이제 빠르고, 안전하며, 은밀하고, 확장성까지 갖춘 암호화된 인증 시스템을 생성할 수 있는 것이다.
이제 암호화의 작동 원리를 배웠으니, 이 암호화가 적용된 실례인 VPN 추천 목록 을 한 번 살펴보자.
이 글을 개선할 수 있는 방법에 대해 의견을 남겨 주세요. 여러분의 피드백이 중요합니다!