어떻게 몰래 열쇠 나눠 갖기
두 사람이 같은 자물쇠를 쓰려면 같은 열쇠가 있어야 한다. 그런데 그 열쇠를 어떻게 건넬까? 우편으로 보내면 중간에서 누가 베낄 수 있고, 직접 만나자니 너무 멀어요. 놀랍게도 열쇠를 한 번도 보내지 않고 두 사람이 같은 열쇠를 갖는 방법이 있다. 둘이 함께 만들어 내는 것이다.
빠른 열쇠를 안전하게 나눠야 해요
앞 레슨에서 본 공개키 암호는 안전하지만 계산이 무거워 느리다. 긴 내용을 통째로 이것으로 주고받으면 너무 오래 걸려요. 그래서 실제 내용은 대칭키 암호로 빠르게 잠근다.
문제는 대칭키를 쓰려면 두 사람이 똑같은 열쇠를 가져야 한다는 점이다. 대칭키 레슨에서 막혔던 키 배송 문제가 여기서 다시 나온다. 공개키로 대칭키를 잠가 보내는 방법도 있지만, 이번에는 아예 열쇠를 보내지 않는 다른 길을 살펴본다.
공개키와 대칭키를 눌러 견줘 보자. 공개키는 안전하지만 느리고, 대칭키는 빠르지만 같은 열쇠를 나눠 가져야 해요.
빠른 대칭키를 쓰고 싶은 마음은 분명하다. 하지만 그 열쇠를 그냥 보내면 위험해요. 중간에서 누가 베끼면 자물쇠가 아무리 튼튼해도 소용이 없다.
그러니 열쇠 자체는 길에 내보내지 않으면서 두 사람이 같은 열쇠를 갖는 방법이 필요하다. 이 방법을 물감 섞기에 빗대어 그려 보자.
공개 색에 비밀 색을 섞어요
두 사람을 가람과 나래라고 하자. 먼저 둘이 함께 쓸 공개 색 하나를 정한다. 이 색은 누가 봐도 상관없어요. 다음으로 각자 남에게 절대 보여 주지 않을 비밀 색을 하나씩 고른다.
가람은 공개 색에 자기 비밀 색을 섞어 새 색을 만들고, 나래도 공개 색에 자기 비밀 색을 섞어 새 색을 만든다. 그리고 이 섞인 색만 서로에게 보낸다. 물감은 한번 섞이면 어떤 색을 섞었는지 다시 갈라내기 어렵다는 점이 중요하다.
가람과 나래가 각자 공개 색에 비밀 색을 섞도록 눌러 보자. 섞인 두 색만 서로에게 보내지고, 비밀 색은 손에 그대로 남아요.
이제 가람은 나래가 보낸 섞인 색을, 나래는 가람이 보낸 섞인 색을 들고 있다. 둘 다 공개 색도 안다. 아직은 서로 다른 색을 들고 있지만, 한 단계만 더 가면 같아져요.
각자 받은 색에 자기 비밀 색을 한 번 더 섞으면 두 사람이 똑같은 색에 이른다. 왜 그런지 직접 확인해 보자.
둘이 같은 최종 색에 도달해요
가람이 든 것은 나래의 비밀 색이 섞인 색이고, 가람은 여기에 자기 비밀 색을 섞는다. 그러면 공개 색에 두 사람의 비밀 색이 모두 섞인 색이 된다. 나래도 똑같이 가람의 비밀 색이 섞인 색에 자기 비밀 색을 섞어요.
섞는 순서는 달라도 들어간 색이 같으니 결과는 같다. 그래서 두 사람은 똑같은 최종 색에 이른다. 이 최종 색이 둘만 아는 공유 비밀이고, 이것을 대칭키로 쓴다.
두 칸의 최종 색이 똑같아졌다. 열쇠는 한 번도 길에 나가지 않았고, 오간 것은 공개 색과 섞인 색뿐이에요. 그런데도 둘은 같은 열쇠를 손에 넣었다.
같은 비밀을 보내는 것이 아니라 함께 만드는 것, 이것이 키 교환의 핵심이다. 처음 이 방법을 내놓은 두 사람의 이름을 따서 디피·헬먼 키 교환이라고 부르고, 실제로는 물감 대신 큰 수의 계산을 쓴다. 그렇다면 오가는 색을 누가 다 엿보면 어떻게 될까?
엿봐도 최종 색은 못 만들어요
길에서 오가는 색을 모두 지켜보는 사람이 있다고 하자. 이 사람은 공개 색을 안다. 가람이 보낸 섞인 색도, 나래가 보낸 섞인 색도 봤어요. 그래도 최종 색은 만들 수 없다.
최종 색을 만들려면 누군가의 비밀 색이 있어야 하는데, 비밀 색은 한 번도 길에 나오지 않았다. 섞인 색에서 비밀 색만 다시 뽑아내는 것도 아주 어렵다. 그래서 엿보는 사람은 같은 최종 색에 이르지 못한다.
엿보는 사람이 길에서 본 것을 하나씩 눌러 짚어 보자. 공개 색과 섞인 색은 다 보여도, 비밀 색이 없어 최종 색은 만들 수 없어요.
엿보는 사람의 손에는 빈칸이 남았다. 비밀 색이라는 마지막 조각이 없기 때문이에요. 그래서 가람과 나래는 이 최종 색을 둘만의 대칭키로 안심하고 쓸 수 있다.
다만 조심할 점이 있다. 엿보기만 하는 사람은 막아도, 중간에서 가람인 척 나래와, 나래인 척 가람과 따로 색을 섞는 사람은 막지 못한다. 그래서 키 교환은 상대가 진짜인지 확인하는 서명, 인증서와 함께 써야 한다. 또 하나, 키 교환은 공개키로 내용을 잠그는 것과는 다른 일이다.
정리
정리하면 이렇다. 공개키 암호는 안전하지만 느려서 실제 내용은 빠른 대칭키로 주고받는다. 그 대칭키는 보내는 것이 아니라 함께 만든다. 공개 색에 각자의 비밀 색을 섞어 교환하고, 받은 색에 자기 비밀 색을 다시 섞으면 두 사람이 같은 최종 색, 곧 공유 비밀에 이른다.
엿보는 사람은 비밀 색이 없어 그 색을 만들지 못해요. 키 교환은 같은 비밀을 함께 만드는 절차이고, 공개키로 내용을 잠그는 공개키 암호화와는 다르다.
두 개념을 눌러 갈라 보자. 키 교환은 공유 비밀을 함께 만드는 일이고, 공개키 암호화는 공개키로 내용을 잠그는 일이에요.
이제 멀리 떨어진 두 사람이 열쇠를 길에 흘리지 않고도 같은 비밀을 함께 가질 수 있다는 것을 알았다. 이 단순한 색 섞기의 원리가 오늘날 웹사이트에 안전하게 접속할 때마다 쓰여요. 브라우저와 서버는 접속할 때마다 이 방식으로 그 연결에만 쓸 새 대칭키를 만들고, 연결이 끝나면 버린다. 그래서 나중에 서버의 개인키가 새더라도 지난 대화는 풀 수 없는데, 이 성질을 전방 비밀성이라고 부른다.
남은 숙제는 중간에 끼어든 가짜를 걸러 내는 일이다. 다음 레슨에서는 개인키로 남긴 표시로 메시지를 정말 그 사람이 보냈는지 확인하는 전자 서명을 다룬다.