seegongsik
보안

어떻게 열쇠 두 개의 마법, 공개키

앞 레슨에서 열쇠 하나로 잠그고 푸는 대칭키를 봤다. 빠르고 깔끔했지만 멀리 있는 상대에게 그 열쇠를 어떻게 몰래 건네느냐는 숙제가 남았어요. 그런데 잠그는 열쇠와 푸는 열쇠가 서로 다르다면 어떨까? 잠그는 열쇠는 온 세상에 나눠 줘도 괜찮고, 푸는 열쇠만 나 혼자 쥐고 있다면 말이다. 이 생각에서 나온 것이 공개키 암호다.

01

열쇠가 두 개예요

대칭키는 열쇠가 하나였다. 공개키 암호는 짝을 이루는 열쇠 두 개를 함께 만들어 쓴다. 하나는 공개키로, 이름 그대로 누구에게나 나눠 줘도 된다. 다른 하나는 개인키로, 나만 가지고 절대 내주지 않아요.
두 열쇠는 수학적으로 짝지어져 있지만, 공개키를 안다고 해서 개인키를 계산해 낼 수는 없다. 아주 큰 수를 소인수분해하는 일처럼 한쪽 방향은 쉽고 반대 방향은 사실상 불가능한 수학 문제를 바탕으로 만들기 때문이다.

열쇠를 눌러 역할을 살펴요

두 열쇠를 하나씩 눌러 역할을 살펴보자. 공개키는 누구에게나 나눠 주고, 개인키는 나만 가지고 있어요.

공개키는 활짝 펼쳐 둬도 괜찮았고 개인키는 깊이 숨겨 둬야 했다. 같은 짝인데 역할이 정반대예요. 하나는 세상에 알리고, 하나는 끝까지 비밀로 지킨다.
그렇다면 열쇠가 두 개일 때 잠그는 데는 어느 것을 쓰고 푸는 데는 어느 것을 쓸까? 잠그는 쪽부터 보자.

02

공개키로 잠가요

누군가에게 비밀 메시지를 보내려면 먼저 그 사람의 공개키를 구한다. 공개키는 누구나 가질 수 있으니 쉽게 얻어요. 그 공개키로 메시지를 잠근다.
공개키로 잠그는 것은 상대가 나눠 준 열린 자물쇠를 메시지에 채우는 것과 같다. 자물쇠는 누구나 채울 수 있지만, 한번 채우면 채운 사람도 다시 열 수 없다. 공개키로는 잠그기만 되고 풀기는 안 되기 때문이다.

HELLO메시지
공개키
누구나 가진 공개키로 잠글 수 있어요.

공개키로 잠그기를 눌러 보자. 누구나 가진 공개키로 메시지에 자물쇠가 채워져요.

메시지가 잠겨 알아볼 수 없는 모양이 됐다. 잠그는 데 쓴 것은 비밀이 아닌 공개키였어요. 그러니 잠그는 일은 정말 누구나 할 수 있다.
그런데 잠근 사람 자신도 다시 열 수 없다. 공개키로 잠근 자물쇠를 여는 열쇠는 따로 있어요.

03

개인키로만 풀려요

공개키로 잠근 자물쇠는 오직 짝을 이루는 개인키로만 풀린다. 같은 짝의 개인키를 대면 열리고, 다른 키를 대면 꿈쩍도 하지 않아요. 잠글 때 쓴 그 공개키로도 열리지 않는다.
그래서 개인키를 가진 단 한 사람만 그 메시지를 읽을 수 있다. 공개키를 온 세상이 가지고 있어도 읽을 수 있는 사람은 개인키 주인뿐이다.

열쇠를 대 자물쇠를 열어요

열쇠를 하나씩 대 보자. 짝 개인키만 자물쇠를 열고, 잠근 공개키와 엉뚱한 개인키는 모두 실패해요.

짝 개인키를 댔을 때만 열렸다. 이 비대칭이 공개키 암호의 핵심이에요. 잠그기는 누구나, 풀기는 단 한 사람. 잠그는 권한은 활짝 열어 두고 푸는 권한만 단단히 잠가 둔 셈이다.
이 성질 덕분에 앞 레슨의 숙제가 풀린다. 열쇠를 몰래 건넬 필요 자체가 사라지기 때문이다.

04

키 배송 문제가 풀려요

대칭키에서는 같은 열쇠 하나를 두 사람이 똑같이 가지고 있어야 해서 그 열쇠를 몰래 건네는 일이 골치였다. 공개키 암호에는 이 걱정이 없어요. 받을 사람의 공개키는 누가 가져가도 그것으로 잠그기만 할 수 있다.
푸는 개인키는 처음부터 주인 손을 떠나지 않는다. 비밀로 건넬 열쇠가 아예 없으니, 위험한 배송 단계가 통째로 사라진다.

방식을 눌러 단계를 견줘요
방식을 눌러 단계를 견줘요

대칭키와 공개키를 눌러 단계를 견줘 보자. 대칭키에는 비밀 배송 단계가 끼어 있고, 공개키에는 그 단계가 없어요.

두 방식을 나란히 놓으니 차이가 뚜렷했다. 대칭키에는 비밀 배송이라는 위태로운 단계가 꼭 끼어 있었지만, 공개키에는 그 단계가 없어요. 다만 공개키 암호는 계산이 무거워 큰 데이터를 통째로 잠그기에는 느리다.
그래서 실제로는 공개키 암호로 짧은 대칭키를 안전하게 건네고, 데이터는 빠른 대칭키로 잠근다. 남은 숙제도 하나 있다. 내가 받은 공개키가 정말 그 사람의 것인지, 중간에서 누가 바꿔치기한 것은 아닌지 확인해야 한다. 이 문제는 뒤에서 인증서로 다룬다.

05

정리

정리하면 이렇다. 공개키 암호는 짝을 이루는 열쇠 두 개를 쓴다. 공개키는 누구에게나 나눠 주고, 개인키는 나만 가진다. 공개키로 잠근 것은 짝 개인키로만 풀린다. 잠그기는 누구나, 풀기는 단 한 사람이에요.
그래서 공개키는 공개해도 안전하고, 비밀로 건넬 열쇠가 아예 없다. 대칭키의 키 배송 문제가 이렇게 풀린다.

1열쇠 두 개
2공개키로 잠금
3개인키로만 풀림
4키 배송 문제 해결

핵심을 차례로 눌러 되짚어 보자. (열쇠 두 개 → 공개키로 잠금 → 개인키로만 풀림 → 키 배송 문제 해결)

이제 열쇠 두 개의 마법을 알았다. 나눠 주는 열쇠와 나만의 열쇠로 비밀을 안전하게 주고받는 방법이다. 이 한 쌍의 열쇠는 순서를 뒤집어 쓰면 위조할 수 없는 서명을 만드는 데에도 쓰이는데, 이것은 전자 서명 레슨에서 다룬다.
그 전에 다음 레슨에서는 열쇠를 아예 보내지 않고도 두 사람이 같은 비밀 열쇠를 함께 만들어 갖는 방법, 키 교환을 살펴봐요.

한 줄 정리공개키 암호는 짝을 이루는 열쇠 두 개를 쓴다. 공개키는 누구에게나 나눠 줘도 되고, 개인키는 나만 가진다. 공개키로 잠근 것은 오직 짝 개인키로만 풀리고, 잠근 공개키로도 풀리지 않아요. 공개키에서 개인키를 계산해 낼 수도 없다. 그래서 받을 사람의 공개키는 온 세상에 공개해도 안전하고, 누구든 그 공개키로 잠가 보내면 개인키 주인만 풀 수 있다. 대칭키의 골치였던 키 배송 문제가 사라지는 것이다. 다만 계산이 무거워서 실제로는 공개키 암호로 대칭키를 건넨 뒤 데이터는 대칭키로 잠그고, 받은 공개키가 진짜인지 확인하는 일은 인증서가 맡아요.
← 보안
이 페이지가 도움 됐다면 후원하기