목차
앞 글의 마지막 구멍은 “같은 열쇠를 어떻게 건네나”였다. 공개키는 그 질문 자체를 바꾼다 - 건넬 필요가 없는 열쇠를 만든다.
잠그는 열쇠와 여는 열쇠를 나눈다
대칭키는 열쇠가 하나였다. 공개키(비대칭)는 한 쌍을 만든다. 수학적으로 짝지어진 두 열쇠다.
- 공개키(public key) - 누구에게나 나눠준다. 이걸로 잠근다.
- 개인키(private key) - 나만 갖고 절대 안 내놓는다. 이걸로 연다.
핵심은 공개키로 잠근 것은 개인키로만 열린다는 점이다. 공개키로는 못 연다. 잠근 사람조차 못 연다. 그래서 잠그는 열쇠는 온 세상에 뿌려도 안전하다.
아무나 잠그고 나만 연다
우체통을 떠올리면 된다. 투입구는 누구에게나 열려 있다(공개키로 넣기). 하지만 꺼내는 문 열쇠는 집주인만 갖는다(개인키로 꺼내기).
철수 --- 영희의 "공개키"로 메시지를 잠근다 ---> 영희만 "개인키"로 연다
(공개키는 아무나 알아도 됨) (개인키는 영희만)여기서 앞 글의 키 분배 문제가 사라진다. 영희는 공개키를 아무 데나 올려두면 된다 - 게시판에, 웹사이트에. 철수는 그걸 가져다 잠그고, 도청자가 그 공개키를 똑같이 봐도 잠글 수만 있지 열지는 못한다. 건네야 할 비밀(개인키)이 애초에 상대에게 갈 일이 없다.
한 방향으로만 쉽다
어떻게 “공개키로 잠근 걸 공개키로는 못 여나”? 한 방향은 쉽고 반대는 지독히 어려운 계산에 기댄다.
큰 소수 둘을 곱하는 건 쉽다.
61 × 53 = 3233 (곱하기: 순식간)
3233 = ? × ? (되돌리기: 두 소수를 찾아야 함)작은 수라 금방 보이지만, 수백 자리 수가 되면 곱하기는 여전히 쉽고 되돌리기(소인수분해)는 사실상 불가능해진다. RSA가 이 비대칭성에 기댄다. 공개키는 곱해진 큰 수 쪽, 개인키는 원래 두 소수 쪽이라고 거칠게 보면 된다 - 여는 쪽 정보(개인키) 없이는 되돌릴 수 없다.
공개키는 느리다
이 무거운 수학이 대가를 부른다. 공개키 연산은 대칭키보다 수백~수천 배 느리다. 큰 파일이나 통신 본문을 통째로 공개키로 암호화하는 건 현실적으로 감당이 안 된다.
그래서 공개키를 데이터 감추기에 직접 쓰지 않는다. 공개키가 잘하는 건 작은 것 하나를 안전하게 건네는 일이다. 그 “작은 것”으로 무엇을 건네면 좋을까 - 바로 대칭키다.
그래서 열쇠만 공개키로 건넨다
두 암호를 합친다. 이게 하이브리드다.
공개키로는 대칭키 하나만 건네고(느려도 작으니 괜찮다), 본문은 빠른 대칭키로 감춘다. 공개키의 “분배 문제 해결”과 대칭키의 “속도”를 둘 다 가진다. 매번 새 대칭키(세션 키)를 뽑아 쓰므로, 한 세션 키가 새도 다른 세션은 멀쩡하다.
실은 열쇠를 “합의”하기도 한다
위처럼 대칭키를 공개키로 감싸 보내는 방식도 있지만, 지금의 HTTPS는 한 걸음 더 간다. 양쪽이 공개 정보만 주고받아 같은 대칭키를 각자 계산해낸다(키 합의, Diffie-Hellman). 열쇠를 아예 선 위로 보내지 않는다 - 도청자는 오간 공개 정보를 다 봐도 그걸로 대칭키를 계산할 수 없다.
이게 주는 이점이 전방향 안전성이다. 나중에 서버의 개인키가 털려도, 지난 세션들은 그 개인키로 복호화되지 않는다 - 세션 키가 개인키에서 나온 게 아니라 그때그때 합의된 것이라서다. 방식은 달라도 목적은 같다. 비싼 공개키 연산으로 대칭키 하나를 안전하게 마련하고, 나머지는 대칭키에 맡긴다.
이 공개키가 진짜 그 사람 것인가
하이브리드에 아직 뚫린 데가 있다. 철수가 집어 온 “영희의 공개키”가 진짜 영희 것이 맞나?
철수 → [ 중간자 ] → 영희
공격자가 자기 공개키를
"영희 것"이라며 건네면?공격자가 중간에서 자기 공개키를 영희 것인 척 내밀면, 철수는 공격자에게 잠가 보내는 꼴이 된다(중간자 공격). 공개키를 아무나 뿌릴 수 있다는 장점이 그대로 약점이 된다 - 뿌려진 그 열쇠가 진짜 그 사람 것인지 보증이 없으면.
이 “공개키의 주인을 어떻게 믿나”를 푸는 게 인증서다. 디지털 서명과 인증서 글에서 다룬다.
실무에서: 크기가 다르다
- RSA는 열쇠가 크다(2048비트 이상). 같은 안전을 **타원곡선(ECC)**은 훨씬 짧은 열쇠로 낸다 - 그래서 요즘 새 시스템은 ECC 쪽을 많이 쓴다.
- 개인키는 절대 안 내보낸다. 서버 개인키가 새면 신원 증명이 통째로 무너진다.
- 공개키를 직접 주고받아 믿는 일은 거의 없다. 인증서에 담겨 오고, 그 인증서를 검증한다(인증서 글).
정리
- 공개키는 열쇠를 한 쌍으로 나눈다 - 공개키로 잠그고 개인키로만 연다. 그래서 잠그는 열쇠를 뿌려도 안전하고, 대칭키의 분배 문제가 풀린다.
- 한 방향은 쉽고 반대는 불가능한 계산에 기댄다(소인수분해 등). 대신 느리다.
- 그래서 실제 통신은 하이브리드 - 공개키로 대칭키만 마련하고(감싸 보내거나 합의하고), 본문은 대칭키로 감춘다.
- 남는 구멍은 “이 공개키가 진짜 그 사람 것인가” - 이걸 인증서가 보증한다.
다음 글은 감추기에서 잠깐 벗어나, 바뀌었는지를 아는 해시와 HMAC로 간다.