비밀키와 공개키의 원리


지난 장에서는 상당수 블록체인(Block Chain)의 핵심 알고리즘인 SHA-256 해시(Hash)에 대해서 공부하는 시간을 가졌다. 블록체인은 근본적으로 해시 알고리즘을 이용함으로써 코인의 거래 장부가 정상임을 보장할 수 있다. 즉 거래 장부의 무결성(Integrity)을 보장할 수 있는 것이다. 다만 ‘거래 기록이 변조되지 않았음’을 보장할 수는 있으나 이것만으로는 장부 안에 있는 모든 기록이 애초에 사실이었는지는 보장할 수 없다. 만약 과거의 거래 기록 중에서 ‘A가 B에게 100코인을 보냈다’라는 기록이 존재한다고 할 때 이 기록 자체가 거짓된 것이라면 어떻게 할까?


[그림 1] 거짓 장부를 작성하는 기본 아이디어


간단한 예시를 살펴보자. 가장 대표적인 거짓 장부의 예는 실제로 보내지도 않은 돈을 보냈다고 속이는 것이다. 특정 블록체인에서 위와 같이 ‘동빈’이라는 나쁜 채굴 참여자가 ‘종구’가 자신에게 100 코인을 전송했다는 거짓 거래 내역을 장부에 기록함으로써 자신이 종구의 코인을 가지고 있다고 주장하고 있다. 지난 절에서 자세히 배웠듯이 장부에 기록된 정보는 해시(Hash)에 의해서 무결성을 보장받으므로 블록이 연달아 생성될수록 더욱 변조하기가 어렵다. 따라서 애초에 ‘거짓 거래 내역’이 공공 거래 장부에 기록되는 순간 이를 되돌리기가 어렵다는 것이다.


그러므로 애초에 ‘동빈’이 ‘종구’의 이름으로 거래 내역을 기록할 수 없도록 해야 한다. ‘종구’가 코인을 전송했다는 정보는 반드시 ‘종구’만 기입할 수 있어야 한다. 실제로 블록체인에서는 이것을 공개키 기반 구조(Public Key Infrastructure)를 이용해 해결한다. 공개키 기반 구조란 비밀키와 공개키라는 두 개의 키를 이용하는 암호 구조이다. 이러한 공개키 기반 구조에서 특정한 데이터를 암호화하고 싶을 때는 먼저 비밀키를 이용해 그 데이터를 암호화한다. 이후에 암호화된 데이터는 오직 그 비밀키와 한 쌍을 이루는 공개키를 이용했을 때만 복호화할 수 있다.


이러한 특징 때문에 공개키 기반 구조는 주로 행위를 증명할 때 사용한다. 가령 A가 B에게 100코인을 전송했다는 사실을 증명하고자 하는 경우를 살펴보자. A는 자신이 가지고 있는 비밀키를 이용해 자신이 B에게 100코인을 전송했다는 메시지를 암호화한다. 이후에 그 암호문을 공개키와 함께 주변 네트워크에게 전달한다. 이후에 주변 네트워크에 포함되어 있는 사람들은 해당 암호문이 A의 공개키를 이용해 복호화를 했을 때 성공적으로 복호화가 되는 것을 보고, A가 B에게 코인을 전송했다는 사실을 확인한다. 실제로 코인 거래의 증명은 이러한 방식을 따른다.


[그림 2] 공개키 기반 구조를 활용한 코인 전송의 원리


그렇다면 여기에서 한 번 더 나아가서 특정한 공개키의 주인이 A라는 사실은 어떻게 증명할 수 있을지 알아보자. 이는 공개키의 주인을 식별할 때 사람의 이름이나 아이디를 사용하지 않고 지갑 주소(Address)를 사용함으로써 해결하는데, 여기에서 해시(Hash)의 개념이 한 번 더 등장한다. 실제로 우리가 코인을 거래할 때는 공개키에 해시 알고리즘을 적용한 문자열을 생성하여 이를 지갑 주소로 사용한다. 즉 실제로 블록체인에서 A라는 사람은 그 지갑 주소로서 대변되는 것이다. 이 때 지갑 주소는 오직 해당 공개키로만 만들 수 있으며 중복되지 않는다.


따라서 네트워크에 참여한 사람들은 특정한 암호 메시지를 공개키로 복호화를 한 뒤에 메시지에 적혀 있는 ‘코인을 전송하는 사람’이 해당 공개키에 해시 알고리즘을 적용한 값과 일치하는지 확인한다. 이 때 코인을 전송하는 사람, 즉 송신자 지갑 주소가 해당 공개키에 해시를 적용한 지갑 주소와 일치하는 경우에만 정상적인 거래로 인정해주는 것이다. 이와 같이 블록체인은 다양한 종류의 암호화 알고리즘이 덕지덕지 붙어 있는 암호화 기법의 집합체라고 할 수 있다.


그러므로 이러한 블록체인의 기술에 따라서 우리는 타인의 지갑에 있는 코인을 쉽게 빼낼 수 없다. 개인의 지갑 주소는 네트워크에 공유되므로 쉽게 알아낼 수 있지만 ‘특정 지갑 주소로 다른 지갑으로 코인을 전송했다’는 메시지를 만들기 위해서는 특정 지갑의 비밀키를 알아내야 하기 때문이다. 결과적으로 개인키를 도난당하지 않는 이상 자신의 코인은 안전하다고 볼 수 있다. 구체적으로 개인키부터 공개키와 지갑 주소를 생성할 때 사용하는 매커니즘은 다음과 같다.


[그림 3] 블록체인의 지갑 주소 생성 매커니즘


공개키 기반 구조를 근간으로 하는 암호화 알고리즘에는 다양한 종류가 있지만 블록체인에는 ‘타원 곡선 암호 알고리즘(ECC)’이 주로 사용된다. 타원 곡선 암호 알고리즘은 쉽게 말해 ‘특정한 비밀키를 입력했을 때 타원 곡선을 이용해 그에 상응하는 공개키를 생성해주는 알고리즘’이다. 이 또한 당연히 공개키 기반 구조이므로 공개키를 가지고 원해의 비밀키가 무엇이었는지 알 수 없다는 점에서 강력하다. 공개키를 생성한 이후에는 해시 알고리즘을 적용해 지갑 주소를 생성한다. 이 때 일반적으로 이전 시간에 배웠던 SHA-256 알고리즘을 이용한다.


호기심이 많은 독자라면 자신이 직접 비밀키와 공개키를 생성을 해보고 싶을 것이다. 다행히도 이미 인터넷에는 수없이 많은 자료가 존재하기 때문에 누구나 쉽게 위 매커니즘을 실습해 볼 수 있다. 다음에서 블록체인 암호화를 실습하는 시간을 가져볼 것이다.


공개키를 이용한 블록체인 암호화 실습하기


공개키를 이용한 블록체인 암호화 기법에 대해서 자세히 이해하기 위해서는 실습을 통해 직접 체험해보는 것이 좋다. 앤더스 브라운워스(Anders Brownworth)가 개발한 무료 교육용 웹 사이트인 블록체인 데모(Blockchain Demo)를 이용해보자. 전체 웹 사이트 소스코드는 오픈소스로 공개되어 있다. URL(https://anders.com/blockchain/public-private-keys/keys.html)에 접속하면 다음과 같은 화면을 만날 수 있다.



사이트에 처음 접속하면 위와 같이 무작위의(Random) 비밀키(Private Key)가 생성되어 있다. 또한 해당 비밀키를 이용해 만들어진 공개키(Publick Key)가 출력된다. 사용자가 임의대로 비밀키를 변경할 수 있는데 변경을 할 때마다 공개키도 자동으로 변경된다. 실제 블록체인에서도 비밀키는 절대 잊어버리거나 누설해서는 안 되는 중요한 정보이다.



이제 위와 같이 ‘Signatures’ 탭으로 이동하면 위와 같이 특정한 메시지를 비밀키를 이용해 암호화할 수 있다. 암호문은 메시지 서명(Message Signature)로 표현된다. 이제 이후에 이 암호화된 메시지와 공개키를 주변 네트워크로 전달했다고 가정해보자. 



이후에 ‘Verify’ 탭으로 이동한 뒤에 ‘Verify’ 버튼을 누르면 해당 암호문 메시지를 공개키로 복호화 하여 성공적으로 데이터가 검증되었다고 출력되는 것을 알 수 있다. 이는 블록체인 네트워크에서 주변 컴퓨터들이 특정한 하나의 거래에 대해서 ‘입증’을 해주는 과정과 같다.



이후에 ‘Transaction’ 탭으로 이동한 뒤에 다음과 같이 다시 한 번 서명을 생성해보자.



이번에는 위 그림에서 보여주는 바와 같이 단순한 문자열 메시지가 아니라 실제로 자신의 지갑에서 특정한 지갑으로 코인을 전송했다는 데이터를 토대로 메시지 서명을 만들어낸 것을 알 수 있다. 물론 내부적인 작동 원리는 직전에 했던 단순 문자열 메시지 서명과 거의 동일하다.



이후에 ‘Verify’ 탭으로 이동하면 실제로 주변 네트워크가 해당 메시지 서명을 복호화하는 과정을 테스트할 수 있다. 다만 이 탭에서는 복호화에 필요한 공개키가 존재하지 않는 것을 알 수 있다. 예리한 독자들은 이미 눈치를 챘겠지만 공개키는 지갑의 주소와 1:1로 대응한다. 따라서 송신자(From)에 적혀있는 문자열이 바로 공개키 자체로 사용되는 것이다. 이 블록체인 데모 사이트는 말 그대로 블록체인 데모이므로 블록체인의 핵심 원리를 설명하는 데에 주력하고 있다. 실제로 암호화폐의 블록체인을 그대로 가져온 것은 아니므로 이론적으로만 이해하면 충분하다.



마지막으로 이전 시간에 배운 블록체인의 무결성에 대한 내용과 공개키 기반 구조에 대한 내용을 모두 종합한 예시를 확인해보자. 위와 같이 마지막 탭인 ‘Blockchain’ 탭으로 이동하면 여러 개의 블록이 존재하고, 블록마다 여러 개의 거래 내역이 포함되어 있다. 또한 각 거래 내역은 공개키 알고리즘이 적용되어 있다. 각 메시지 서명(Signature)들은 블록의 ‘현재 해시’ 값에 영향을 미친다는 점에서 특정한 거래 내역의 데이터를 조금만 변경해도 해당 블록은 잘못된 블록으로 인식된다. 이와 같이 블록체인은 공개키 기반 구조와 해시 알고리즘이 적절히 어우러져 있다.

+ Recent posts