지식

[Security] 암호기술에 대한 최소 이론 7강 — 비대칭 키가 인터넷에서 작동하는 기본 원리

암호기술에 대한 최소 이론 시리즈 정리 — 7강. 참고: 널널한 개발자 TV, 비대칭키가 인터넷 환경에서 사용되는 기본 원리 (재생목록)

암호 알고리즘 하나를 아는 것과, 그 알고리즘이 인터넷 위에서 실제로 어떻게 굴러가는지를 아는 것은 다른 문제다. 이번에는 인터넷에 연결된 두 대의 엔드포인트가 비대칭 키로 비밀 통신을 시작하는 절차를 순서대로 정리한다. 키 쌍을 만들고, 공개키를 주고받고, 상대의 공개키로 잠근 뒤 자기 개인키로 여는 — 공개키 기반 구조(PKI)가 작동하는 가장 기본적인 골격이다. 이 글은 완성된 시스템이 아니라 거기까지 가는 과정을 다룬다.

무대 — 퍼블릭 구간을 지나는 통신

시나리오는 단순하다. 인터넷에 연결된 엔드포인트가 두 대 있다. 한쪽은 PC, 한쪽은 서버다. 두 엔드포인트 사이에는 라우터를 거치는 구간이 놓여 있고, 이 구간을 퍼블릭 구간이라고 부른다. 내 손이 닿지 않는 남의 장비들이 데이터를 중계하는 영역이다.

   [ PC ] ── 라우터 ────── 인터넷 ────── 라우터 ── [ 서버 ]

   종단 단말 : [ PC ], [ 서버 ]
   퍼블릭 구간 : 라우터 ~ 인터넷 ~ 라우터 (남의 장비가 중계한다)

종단 단말 사이의 통신 내용이 이 퍼블릭 구간에 평문 그대로 노출되면 기밀이 유지되지 않는다. 그래서 결론은 하나다. 암호화를 해야 한다.

동작은 이렇게 된다. 보낼 정보는 처음에 평문이다. 그 평문을 그대로 인터넷에 내보내면 곤란하니 암호문으로 바꿔서 퍼블릭 구간을 통과시킨다. 받는 쪽은 도착한 암호문을 다시 평문으로 복원한다. 원문을 되찾을 수 있다면, 퍼블릭 구간을 안전하게 지나온 셈이 된다.

   [ PC ] 평문 ─[ 암호화 ]─▶ 암호문 ─▶ 퍼블릭 구간

   퍼블릭 구간 ─▶ 암호문 ─[ 복호화 ]─▶ 평문 [ 서버 ]

   퍼블릭 구간을 지나는 것은 암호문뿐 (노출돼도 읽히지 않는다)

대칭 키의 벽 — 키를 어떻게 건네나

여기서 대칭 키 방식을 쓰면 문제가 하나 남는다. 대칭 키는 암호화할 때와 복호화할 때 같은 키를 쓰는 방식이다. 그러니 받는 쪽도 같은 키를 가지고 있어야 한다.

그렇다면 그 키 자체를 상대방에게 어떻게 안전하게 전달할 것인가. 키를 퍼블릭 구간으로 그냥 보내면 키가 노출되고, 키가 노출되면 암호문도 전부 풀린다. 정작 지켜야 할 것을 지키지 못하는 구조다. 이 키 전달 문제의 대안으로 나온 것이 비대칭 키다.

구분 대칭 키 비대칭 키
키 개수 통신 주체가 공유하는 키 1개 주체마다 키 쌍 1개(공개키·개인키), 두 주체면 총 4개
암호화에 쓰는 키 공유 키 받는 쪽의 공개키
복호화에 쓰는 키 같은 공유 키 받는 쪽의 개인키
키 전달 문제 있다 — 키를 안전하게 건넬 방법이 따로 필요하다 없다 — 공개키는 노출을 전제로 주고받는다
대표 알고리즘 AES RSA, ECC

1단계 — 키 쌍 생성

두 통신 주체가 "비밀 통신을 하자"고 합의하면, 보안 통신 채널을 만들기 위해 가장 먼저 하는 일이 키 쌍 생성이다.

PC는 자기 것으로 공개키와 개인키를 한 쌍 만든다. 서버도 마찬가지로 자기 공개키와 개인키를 한 쌍 만든다. 여기서 놓치면 안 되는 것은 이것이 이라는 사실이다. 아무 공개키와 아무 개인키가 짝이 되는 것이 아니라, 함께 생성된 둘만이 서로의 짝이다.

   [ PC ] 키 쌍 생성
     ├─ PC 공개키
     └─ PC 개인키

   [ 서버 ] 키 쌍 생성
     ├─ 서버 공개키
     └─ 서버 개인키

   → 키는 총 4개, 쌍은 2개 (함께 생성된 둘만이 서로의 짝)

키 쌍을 만드는 일은 명령 한 줄이면 된다. RSA 키 쌍을 만들고 거기서 공개키만 뽑아내는 예시는 다음과 같다.

# 2048비트 RSA 키 쌍 생성 (개인키 파일에 쌍 정보가 담긴다)
openssl genrsa -out private.pem 2048

# 개인키에서 공개키만 추출
openssl rsa -in private.pem -pubout -out public.pem

private.pem은 밖으로 내보내지 않는 파일이고, public.pem은 상대에게 건네는 파일이다. 파일 안에는 -----BEGIN PUBLIC KEY----- 다음에 MIIB... 같은 인코딩된 키 자료가 들어 있다.

2단계 — 키 교환

키 쌍이 만들어졌으면 다음은 키 교환이다. 이름은 거창하지만 하는 일은 단순하다. 각자 자신의 공개키를 상대에게 보내주는 것이 전부다.

PC는 자신의 공개키를 서버에 보낸다. 서버는 자신의 공개키를 PC에 보낸다. 개인키는 보내지 않는다.

   ① [ PC ] ──── PC 공개키 ────▶ [ 서버 ] 가 보관
   ② [ 서버 ] ──── 서버 공개키 ────▶ [ PC ] 가 보관
   ※ 개인키는 보내지 않는다

   교환 결과
     ├─ PC 가 가진 것 : PC 개인키 + 서버 공개키
     └─ 서버가 가진 것 : 서버 개인키 + PC 공개키

이 교환이 끝나면 PC는 서버의 공개키를, 서버는 PC의 공개키를 갖게 된다. 그리고 각자 자기 개인키는 계속 자기 손에만 있다.

공개키는 왜 공개해도 되나

여기서 자연스러운 의문이 하나 생긴다. 공개키를 퍼블릭 인터넷으로 주고받았다면, 그 구간에 붙어 있는 해커도 그 공개키를 볼 수 있다. 그런데도 보안에 문제가 없다.

이유는 공개키의 용도가 암호화 하나뿐이기 때문이다. 공개키는 자물쇠를 잠그는 일만 한다. 잠긴 자물쇠를 따는 일, 즉 복호화는 그 공개키와 쌍을 이루는 개인키만 할 수 있다. 공개키를 아무리 많이 손에 넣어도 그것으로 할 수 있는 일은 새로 잠그는 것뿐이고, 이미 잠긴 것을 여는 데는 쓸 수 없다.

이름 용도 공개 여부
공개키 (public key) 바깥에 올려도 되는 키 암호화 — 자물쇠를 잠근다 인터넷에 공개된다
개인키 (private key) 비밀키라고도 한다 복호화 — 자물쇠를 딴다 밖으로 내보내지 않는다

이 비대칭성은 수학적 성질에 기대고 있다. 특정한 수학 문제를 이용하면, 한쪽 키로 변환한 결과를 되돌릴 수 있는 것은 짝이 되는 다른 쪽 키뿐이 되도록 키 쌍을 만들 수 있다. RSA는 큰 수의 소인수분해가 어렵다는 성질을, ECC는 타원곡선 위의 이산로그 문제가 어렵다는 성질을 이용한다. 방향에 따라 쓰는 키가 달라서 비대칭 키다.

3단계 — 양방향 암호화와 복호화

이제 실제 통신이다. 보내는 쪽은 받는 쪽의 공개키로 잠그고, 받는 쪽은 자기 개인키로 연다. 방향이 바뀌면 쓰이는 키 쌍도 바뀐다.

PC가 서버로 데이터를 보낼 때는 이렇게 된다. PC의 손에는 키가 세 개 있지만(자기 공개키, 자기 개인키, 서버 공개키), 암호화에 쓰는 것은 서버가 보내준 서버의 공개키다. 그 암호문이 퍼블릭 구간을 지나 서버에 도착하면, 서버는 그 공개키와 쌍을 이루는 서버 자신의 개인키로 복호화한다. 서버의 개인키는 바깥으로 공개된 적이 없고 서버 자신만 안다. 그래서 도중에 누가 암호문을 가로채도 풀 수 없다.

   PC ──▶ 서버
     ① 평문 ─[ 서버 공개키로 암호화 ]─▶ 암호문
     ② 암호문 ─▶ 퍼블릭 구간 통과 ─▶ 서버 도착
     ③ 암호문 ─[ 서버 개인키로 복호화 ]─▶ 평문

반대 방향도 대칭적으로 같다. 서버가 PC로 보낼 때는 PC가 보내준 PC의 공개키로 암호화하고, 받은 PC가 자신의 개인키로 복호화한다.

   서버 ──▶ PC
     ① 평문 ─[ PC 공개키로 암호화 ]─▶ 암호문
     ② 암호문 ─▶ 퍼블릭 구간 통과 ─▶ PC 도착
     ③ 암호문 ─[ PC 개인키로 복호화 ]─▶ 평문

한 줄로 줄이면 이렇다.

  암호화 = 받는 사람의 공개키
  복호화 = 받는 사람의 개인키

정리하면 대칭 키가 안고 있던 키 전달 문제가 사라진다. 퍼블릭 구간으로 오간 것은 공개키뿐이고, 공개키는 노출을 전제로 만들어진 물건이다. 복호화 능력을 가진 개인키는 애초에 자기 장비 밖으로 나간 적이 없다. 이것이 PKI 체계가 작동하는 기본 원리다. (같은 키 쌍을 반대로 써서, 개인키로 만든 값을 공개키로 검증하는 용법이 전자서명인데 이 글의 범위는 아니다.)

그런데 아무도 이대로 쓰지 않는다

여기까지가 비대칭 키의 기본 골격이다. 그런데 실제 인터넷에서는 아무도 이 방식을 이대로 쓰지 않는다. 여러 이유가 있다. 비대칭 키 연산은 대칭 키에 비해 훨씬 무거워서 주고받는 데이터 전부를 이 방식으로 처리하기 어렵다는 점, 그리고 내가 받은 공개키가 정말 그 상대의 것인지 확인할 방법이 이 골격 안에는 없다는 점이 대표적이다.

그래서 실제 시스템은 이 골격 위에 몇 겹을 더 얹는다. 다만 그 이야기로 넘어가려면 일단 이 골격이 어떻게 생겼는지를 알고 있어야 한다.

정리

  • 두 엔드포인트 사이의 퍼블릭 구간에 평문이 노출되면 기밀이 깨진다. 그래서 평문을 암호문으로 바꿔 통과시키고, 받는 쪽이 평문으로 복원한다.
  • 대칭 키는 암호화와 복호화에 같은 키를 써서, 그 키를 상대에게 안전하게 전달하는 문제가 남는다. 그 대안이 비대칭 키다.
  • 절차는 세 단계다 — ① 두 주체가 각자 키 쌍(공개키·개인키)을 생성하고(키 4개, 쌍 2개), ② 서로 공개키만 교환하고, ③ 통신한다.
  • 공개키는 암호화 전용이라 인터넷에 공개돼도 문제가 없다. 잠긴 것을 여는 일은 쌍을 이루는 개인키만 할 수 있고, 개인키는 밖으로 나간 적이 없다.
  • 방향에 관계없이 규칙은 하나다 — 받는 사람의 공개키로 암호화하고, 받는 사람의 개인키로 복호화한다.
  • 암호화에 쓰는 키는 공개해도 되므로 공개키(public key), 복호화에 쓰는 키는 나만 아는 개인키·비밀키(private key) 다. 이것이 PKI가 작동하는 기본 원리다.
  • 다만 실제 인터넷은 이 골격을 그대로 쓰지 않는다. 연산 비용과 받은 공개키가 진짜 그 상대의 것인가라는 문제가 남아 있기 때문이다.

다음 편은 실제 인터넷에서 쓰는 키 교환 시스템의 구조다.

조회 1댓글 0

댓글

아직 댓글이 없습니다. 첫 댓글을 남겨보세요.