편지가 진짜인지 확인하기, 서명
지난 강에서 공개키로 잠그면 짝 개인키로만 풀린다는 걸 봤어요. 그런데 메시지가 비밀일 필요는 없고, 그저 진짜 그 사람이 보냈는지만 확인하고 싶을 때가 있어요. 누가 그 사람 이름을 빌려 가짜 편지를 보냈다면요? 만약 보낸 사람이 자기만 가진 개인키로 메시지에 도장 같은 표시를 남기고, 누구나 그 사람의 공개키로 그 표시가 진짜인지 확인할 수 있다면 어떨까요?
누가 보냈는지 모르면
편지 한 통이 도착했다고 해봐요.
끝에는 어떤 사람의 이름이 적혀 있어요.
그런데 정말 그 사람이 쓴 걸까요?
이름은 누구나 베껴 적을 수 있어요.
내용도 누가 슬쩍 고쳤을지 몰라요.
글자만 봐서는 알 길이 없죠.
비밀이냐 아니냐의 문제가 아니에요.
내용은 다 드러나도 괜찮아요.
다만 진짜 그 사람이 보냈는지,
오는 길에 안 바뀌었는지를 알고 싶을 뿐이에요.
이름만 적힌 편지를 살펴봐요. 베낀 이름인지, 내용이 바뀌었는지 글자만으로는 가릴 수 없어요.
직접 눌러 보니 답답했죠.
이름이 적혀 있어도 확신이 안 서요.
바뀐 편지도 멀쩡해 보였고요.
우리에게 필요한 건 두 가지예요.
하나, 진짜 그 사람이 보냈다는 증거.
둘, 오는 동안 안 바뀌었다는 증거.
이걸 한 번에 보여 줄 표시가 있으면 좋겠어요.
게다가 남이 흉내 낼 수 없어야 해요.
다행히 지난 강의 열쇠 한 짝이
그 일을 해낼 수 있어요.
개인키로 서명해요
지난 강에선 받을 사람의 공개키로 잠갔어요.
서명은 방향이 반대예요.
보낸 사람이 자기 개인키를 써요.
개인키로 메시지에 서명을 붙이는 거예요.
이건 자물쇠로 잠그는 게 아니에요.
메시지 옆에 도장 하나를 찍는 셈이죠.
내용은 그대로 다 보여요.
다만 그 도장이 함께 따라와요.
개인키는 그 사람만 가지고 있으니
이 도장은 오직 그 사람만 찍을 수 있어요.
개인키를 눌러 메시지에 서명을 붙여봐요. 내용은 그대로 보이고, 그 사람만 만들 수 있는 도장이 함께 따라와요.
개인키를 누르니 서명이 붙었죠.
메시지 글자는 하나도 안 가려졌어요.
잠근 게 아니라 도장을 더한 거니까요.
이 서명은 메시지 내용과 묶여 있어요.
바로 이 점이 다음에서 중요해져요.
그리고 이 도장을 찍으려면
반드시 그 사람의 개인키가 있어야 해요.
개인키는 주인 손을 안 떠나니
남이 똑같은 도장을 만들 수 없어요.
그럼 받은 쪽은 이걸 어떻게 확인할까요?
공개키로 검증해요
받는 사람은 그 사람의 공개키를 써요.
공개키는 누구나 가질 수 있었죠.
그 공개키로 서명을 검증해요.
검증은 묻는 일이에요.
이 도장이 정말 그 개인키로 찍힌 게 맞나?
맞으면 검증이 통과돼요.
공개키와 개인키는 한 짝이니까
짝이 맞아야만 통과하는 거예요.
엉뚱한 사람의 개인키로 찍은 도장은
그 공개키에 대고 검증하면 실패해요.
여러 서명을 그 사람의 공개키로 검증해봐요. 짝 개인키로 찍은 것만 통과하고, 다른 키로 찍은 건 실패해요.
짝 개인키로 찍은 서명만 통과했죠.
엉뚱한 키로 찍은 건 다 실패했고요.
통과가 뜻하는 건 분명해요.
이 메시지는 진짜 그 사람이 보냈다.
공개키는 온 세상이 가지고 있어도 괜찮아요.
공개키로는 검증만 되지 서명은 못 만드니까요.
도장을 찍는 권한은 개인키 주인에게만,
도장을 확인하는 일은 누구에게나 열려 있어요.
이게 지난 강 잠금의 거울상이에요.
그런데 통과는 진위만 말하는 게 아니에요.
진짜이고, 안 바뀌었어요
서명은 메시지 내용과 단단히 묶여 있어요.
그래서 검증 통과는 두 가지를 한꺼번에 말해요.
하나는 진위, 진짜 그 사람이 보냈다는 것.
다른 하나는 무결성, 한 글자도 안 바뀌었다는 것.
만약 도중에 누가 내용을 살짝 고치면
묶여 있던 서명과 더는 들어맞지 않아요.
그러면 검증이 곧바로 깨져요.
바뀐 한 글자가 곧 경보가 되는 셈이죠.
그래서 통과는 진짜라는 뜻이자
오는 길에 안 건드려졌다는 뜻이에요.
서명된 메시지의 한 글자를 바꿔봐요. 내용과 묶인 서명이 더는 들어맞지 않아 검증이 깨져요.
내용을 한 글자만 바꿨는데도
검증이 곧바로 실패로 돌아섰죠.
묶여 있던 서명이 더는 안 맞으니까요.
받는 사람은 이 실패를 보고 알아채요.
이건 원래 그대로가 아니라고요.
그래서 함부로 믿지 않고 멈출 수 있어요.
바로 이 깨짐이 무결성을 지켜 줘요.
바뀐 메시지를 진짜라고 속을 일이 없어요.
진위와 무결, 이 둘을 한 도장이 한꺼번에 지켜요.
이제 잠금과 서명을 나란히 정리해 봐요.
정리해볼까요
한 줄로 모으면 이래요.
전자 서명은 공개키 암호를 거꾸로 써요.
보낸 사람은 자기 개인키로 메시지에 서명해요.
받는 사람은 그 사람의 공개키로 검증해요.
통과하면 진짜 그 사람이 보냈고,
오는 길에 안 바뀌었다는 게 함께 증명돼요.
잠금은 내용을 비밀로 지키는 일,
서명은 누가 보냈고 안 바뀌었는지 증명하는 일.
같은 열쇠 한 짝으로 방향만 바꿔 둘 다 해내요.
잠금은 비밀, 서명은 진위와 무결이에요.
잠금과 서명을 눌러 견줘봐요. 잠금은 비밀, 서명은 진위와 무결, 한 줄로 차이가 보여요.
이제 잠금과 서명의 차이를 알게 됐어요.
잠그면 비밀이 지켜지고,
서명하면 진짜이고 안 바뀌었음이 증명돼요.
둘 다 같은 열쇠 한 짝에서 나와요.
받을 사람의 공개키로 잠그면 비밀,
보낸 사람의 개인키로 서명하면 진위와 무결.
방향 하나로 쓰임새가 갈리는 셈이죠.
그런데 검증이 통하려면 한 가지 전제가 있어요.
그 공개키가 정말 그 사람 것이어야 한다는 거예요.
그 공개키를 어떻게 믿느냐는 다음 이야기예요.