이전 토픽에서 거래에 대해서 개인키로 서명을 한다고 하였는데, 이것을 바로 디지털 서명이라고 합니다. 디지털 서명을 설명하기 위해서는 개인키(Priviate Key), 공개키(Public Key), 주소(Address)의 개념 설명이 필요합니다. 그냥 암호 하나면 되지 않나 하실 수 있는데, 블락체인에서는 거래(Transaction)가 모든 사람에게 공개가 되기 때문에 단순 암호 방식으로는 보안 문제가 발생합니다.
설명을 위해 비트코인의 디지털 서명 방식을 예로 들겠습니다. 아마도 대부분의 가상화폐가 비트코인과 같은 디지털 서명 방식을 사용할 것입니다.
그럼 먼저 개인키, 공개키, 주소는 어떤 관계 일까요? 아래 그림을 보시죠.
[개인키, 공개키, 주소의 관계, 출처]
위 그림에서 개인키(k)와 공개키(K), 그리고 주소(A)는 어떤 함수로 연결되어 있습니다. 즉 이들은 쌍을 이룬다는 것을 알 수 있습니다. 좀 더 자세히 그림을 살펴보면 개인키를 타원곡선 곱셈함수(Eliptic Curve Multiplication)에 대입하면 바로 공개키가 얻어지는 것입니다. 그리고 이 공개키를 다시 해슁 함수(Hashing Function)에 대입하면 바로 주소가 얻어집니다. 위 그림에서 나타났듯이 공개키와 주소는 엄밀히 같은 것이 아닙니다. 공개기에서 주소가 파생되지만 해슁 함수로 연결되어 있는 구성입니다. 나중에 혼동 안되지 않도록 주의합니다.
공개키와 주소는 엄밀히 얘기하면 같은 것이 아니다.
그림을 잘 보면 오른쪽으로 향하는 화살표가 있고, 왼쪽으로 향하는 화살표가 있습니다. 오른쪽으로 향하는 화살표는 위에서 설명드린대로 키가 변환되는 과정입니다. 그런데 왼쪽으로 향하는 화살표에는 '금지'표시가 있습니다. 즉 주소에서 공개키를 얻는게 안되고, 공개키에서 개인키를 얻는게 안된다는 것을 의미합니다. 따라서 공개키와 주소가 다른 사람에게 공개되어도 개인키를 공개되지 않고 안전하게 사용할 수 있게 됩니다. 여기서 안된다고 했는데, '거의 불가능'하다가 정확한 표현일 것입니다. 만약 '거의 불가능'한 것이 '가능'하게 되면 현대의 암호체계는 다시 만들어야 겠지요.
블락체인의 보안은 '암호'가 아닌 개인키, 공개키 쌍을 이용합니다.
타원곡선 곱셈함수는 그 내용이 까다로와 생략하겠습니다. 세부적인 내용이 알고 싶다면 이곳이나 이곳을 참고바랍니다. 지금은 그냥 한쪽 방향으로만 계산이 수월하고 역으로 계산하는 것은 무지 무지 어렵워서 개인키를 암호화하는데 쓰인다고만 이해하고 넘어가도록 하겠습니다. 그 다음으로 설명드릴 부분이 해슁 함수(Hashing Function)입니다. 위 그림에서 보면 이 해슁 함수도 한방향(One-way)라도 표시되어 있습니다. 즉 한쪽 방향으로만 계산이 쉽고, 역방향은 계산이 매우 어렵다는 의미입니다. 이 해슁 함수는 매우 중요한 개념이고 설명이 어렵지 않아 반드시 이해하고 넘어가도록 하죠.
해슁 함수의 특징은 크게 세 가지 입니다.
- 한방향 함수이다. 역방향 계산은 무지 무지 어렵다
- 함수의 입력의 크기와 상관없이 출력의 크기가 동일하다
- 함수의 입력이 털끝이라도 바뀌면 출력은 완전 달라진다
2번과 3번에 대한 내용을 아래 그림으로 살펴보시죠.
[출처: organic media lab]
위 그림을 잘 보시면 문구에 아주 작은 차이가 있습니다. 보이시나요? 금액이 만원과 십만원으로 차이가 납니다. 각각을 해슁 함수의 입력으로 넣었더니 16진수로 4자리의 출력값을 얻었습니다. 예에서는 출력이 4자리로 나왔지만 비트코인에서는 해슁 함수로 SHA256이란 것을 사용하는데 256자리의 출력값이 얻어지게 됩니다. 중요한 것은 해슁 함수는 입력이 뭐든 출력의 크기가 같다는 것입니다.
그리고, 입력이 아주 털끝만큼 변경되어도 그 출력은 전혀 달라지는 것이 해슁 함수의 특징입니다. 왜 이게 중요할까요? 그것은 해슁 함수의 출력값으로 입력값을 유추할 수 없도록 되어 있다는 것입니다. 이 특징은 이후에 설명할 채굴작업에 필수적입니다.
해슁 함수는 블락체인에 있어서 필수적인 요소입니다.
내용이 점점 길어지고 있지만 드디어 디지털 서명에 대한 설명 들어갑니다. 우리가 인터넷 뱅킹을 사용할 때 인증서 암호를 입력하는 방식은 은행 서버에 암호가 저장되어 있고, 우리가 입력한 것이 서버의 암호와 일치하면 거래를 승인하는 방식입니다. 따라서 암호는 매우 '비밀스럽게' 다루어 져야만 합니다. 이런 방식은 내가 주의하더라도 서버가 누군가에 의해 해킹당하면 내 계좌의 돈이 털릴 수 있는 위험이 있는 구조입니다.(인터넷 뱅킹도 개인키, 공개키 구조입니다.) 반면에 비트코인은 위에서 얘기한 개인키, 공개키 쌍을 이용합니다. 개인키는 말 그대로 개인만 보관하는 것입니다. 은행 서버나 이런데 저장되는 것이 아니죠. 그냥 내 PC에만 저장되어 있는 것입니다(온라인 지갑을 사용한다면 웹에 암호화되어 저장되어 있기도 합니다.) 그리고 공개키는 말 그대로 남들에게 공개하는 것입니다.
블락체인은 개인키, 공개키 쌍으로 보안을 유지합니다.
블락체인에서 거래를 전송할 때, 거래 내역을 개인키로 '서명(암호화)'하고, 서명한 거래내용과 함께 서명에 사용된 개인키와 쌍을 이루는 공개키를 같이 전송합니다. 이 거래의 수신자는 거래내용와 함께 수신된 공개키로 거래내용을 열어서 거래내용의 원본과 동일한지 비교하게 됩니다. 이렇게 두 거래내용이 동일하다면 공개키 주인이 보낸 것임을 확신할 수 있게 되는 것입니다. 이것을 아래 그림으로 보시면 이해가 더 잘 될 것입니다.
[출처: organic media lab]
위 설명과 그림이 조금 다른데요. 그것은 거래내용 자체를 개인키로 암호화하는 것이 아니라 거래내용을 해슁 함수를 통해서 해쉬값을 얻고, 이 해쉬값을 개인키로 암호화하여 거래내용 원문과 함께 공개하게 되는 것입니다. 즉 원문 자체를 개인키로 암호화 하지 않고, 원문의 해쉬값을 암호화합니다. 이렇게 하면 원문이 아무리 길더라도 고정된 해쉬값만 암호화 하면 되므로, 계산적 이득이 됩니다.
거래의 수신자는 송신자의 공개키와 거래내용을 수신하면, 송신자가 서명한 부분을 송신자의 공개키로 엽니다. 그리고 그 값이 수신한 거래내용의 해쉬값과 동일한지를 검토하여 거래를 검증합니다. 거래 순서를 위 그림의 내용으로 한 번 요약하면 아래와 같습니다.
- 송신자는 거래내용을 해슁 함수에 입력하여 해쉬값을 얻는다
- 해쉬값을 송신자의 개인키로 암호화하여 서명하고, 서명을 원문 거래내용, 송신자의 공개키와 함께 전송한다.
- 수신자는 암호화된 서명부분을 송신자의 공개키를 이용하여 연다.
- 수신자는 암호가 풀린 서명부분과 원문 거래내용의 해쉬값을 비교하여 거래를 검증한다.
이렇게 디지털 서명해서 코인의 소유권이 이전되었음을 모두에게 알리고 이를 블락체인에 영구히 기록, 보존하게 되어 있습니다.
디지털 서명은 거래를 수학적으로 확인하는 방법입니다.
이번 토픽의 홈워크는 Blockchain.info에 방문해서 비트코인 지갑을 만들어 보는 것입니다. 만들어진 비트코인 주소를 댓글에 남겨주세요.
블락체인 기반 블로그 Steemit에 Vote가 10개 이상되면 다음 타픽 진행하겠습니다.(희망사항)
Steemit 바로가기