드디어 블록체인 관련 첫 포스팅을 시작할 수 있게되었습니다.
그동안에 혼자서 블록체인 공부할 때는, 제가 남에게 설명하는 과정이 없어서 '아 이 정도면 이해 됐다' 라고 생각하고 공부를 했지만, 막상 다시 돌아보니 관련 개념들을 잘 모르는 경우가 많더군요. 그래서 오늘부터 그러한 개념들을 하나씩 천천히 정리해가며 진행해보도록 하겠습니다.
비트코인이나 이더러움 백서를 읽어보거나 관련 지갑을 사용하다보면 공개키(public key)나 개인키(private key)에 대한 언급을 본 적이 있을 것입니다. 남의 공개키를 넣어서, 개인키로 서명을 하고~~어쩌구 저쩌구~ 하는 내용들이 있습니다.
당시에는 이런 개념들이 제대로 와닿지 않아 그냥 넘어갔지만 너무 찝찝했습니다. 저 뿐만 아니라 많은 사람들도 공개키와 개인키라는 것에 대해서 개념이 어려웠을 것 같아요.
그럼 이제 공개키와 개인키가 무엇인지, 그런 것들이 어떻게 블록체인 상에서 쓰이는 지 알아보겠습니다!
-----------------------------------------------------------------------------
비트코인 블록체인에서 송금을 하는 상황을 알아볼까요?
댕댕이가 있고 냥냥이가 있습니다. 댕댕이가 냥냥이에게 1 BTC을 송금하려고 합니다. 탈중앙화로, 해당 거래가 맞는지 검증할 주체가 없는 블록체인에서 어떻게 송금을 할 수 있을까요?
비트코인과 같은 블록체인에서는 공개키 암호 방식과 해시함수를 사용합니다.
1. 공개키 암호 방식
우선은 말그대로 어떤 메세지를 암호화하고 복호화 하는 방식 중 하나 입니다. 다른 암호 방식에는 대칭키 암호 방식 등이 있습니다.
공개키 암호 방식에서, 사용자는 공개키와 개인키(비밀키)를 부여받습니다. 사용자는 어떤 데이터를 공개키와 개인키를 활용하여 암호할 수 있습니다. 공개키와 개인키는 단 하나의 짝입니다. 개인키가 같고, 공개키가 다른 경우는 존재할 수 없고, 반대로 공개키가 같은데 개인키가 다를 수 없습니다.
공개키는 말 그대로, 남들에게 공개할 수 있는 키이고 개인키는 본인만이 가지고 있어야하고, 개인키가 노출되는 순간 심각한 보안 위협에 처할수 있습니다.
공개키는 개인키를 타원 곡선 암호 알고리즘을 통해 얻습니다. 즉, 비트코인 블록체인 상에서 사용자는 랜덤으로 주어진 개인키를 부여받고, 그 개인키를 타원 곡선 암호 알고리즘을 돌려 공개키를 얻는다고 볼 수 있네요.
개인키로 공개키를 알 수 있는 반면, 공개키로 개인키를 알 수 없습니다.
(1)공개키로 데이터를 암호화하면 개인키로 복호화(암호화를 푸는 것)를 할 수 있고, (2)개인키로 데이터를 암호화하면 공개키로 복호화를 할 수 있습니다. -> 이 두가지 특성이 암호화폐 거래에서 사용됩니다.
(1)의 경우를 보겠습니다. 댕댕이가 냥냥이한테 '댕댕댕'이라는 메세지를 암호화해서 보내고 싶어합니다. 그런데 댕댕이는 냥냥이만 그 메세지를 볼 수 있도록 하고 싶네요. 그럴 경우, 댕댕이가 냥냥이의 공개키로 '댕댕댕' 메세지를 암호화하면, 오직 냥냥이의 개인키로만 메세지를 복호화 할 수 있습니다. 결국, 다른 사람들은 무슨 내용인지 모르고 냥냥이만 해당 메세지를 받을 수 있겠죠?
(2)의 경우를 볼게요. 개인키로 암호화하면, 공개키로 복호화할 수 있습니다. 이 경우는, 메세지를 송신하는 입장의 신원을 확인하는 경우에 쓰입니다. 댕댕이가 냥냥이에게 '냐냐냐용'이라고 메세지를 댕댕이의 개인키로 암호화해서 보냈다고 해볼게요. 냥냥이 및 다른 사람들은 진짜로 댕댕이가 해당 메세지를 보냈는 지 확인하고 싶어합니다. 어떻게 확인할 수 있을까요?
댕댕이는 본인이 댕댕이라는 것을 증명하기 위해서, 메세지를 댕댕이의 개인키로 암호화하고 본인의 공개키를 공개합니다. (여기서 댕댕이 개인키가 해킹당하지 않고, 댕댕이 본인만 개인키를 알고 있다고 가정할게요) 주위 사람들은 댕댕이의 공개키로 해당 메세지가 복호화되는지 확인합니다. 만약 복호화된다면, 분명히 댕댕이의 개인키로 해당 메세지를 암호화 한 것이 분명합니다. 따라서 이렇게 댕댕이는 본인이 보냈다고 증명할 수 있는 것이지요.
(2)의 경우 중 하나가 공인인증서입니다. 공인인증서는 일종의 개인키로써 컴퓨터에 저장해두었다가, 암호를 입력하면서 인터넷 거래 등을 할 때 분명 본인임을 증명할 수 있는 것입니다!
2. 비트코인 거래에서 필요한 것은?
댕댕이가 냥냥이한테 1BTC를 보내고 싶어합니다. 좀 더 자세히 말하면, 댕댕이의 지갑에서 냥냥이의 지갑에 1BTC를 보내는 상황이라고 할 수 있겠네요.
앞서 말했듯이 , 어떤 거래가 있을 때 해당 거래가 올바른지 검증할 주체가 블록체인 상에서 없습니다. 검증할 주체가 없는데, 댕댕이가 냥냥이한테 1BTC를 보냈다고 주장하면 누가 그것을 믿어줄까요? 어떻게 해당 거래가 유효한지 알 수 있을까요?
블록체인 특성상, 트랜젝션이 발생하면 블록을 통해 해당 트렌젝션은 모든 노드에 전파됩니다.
거래가 발생하면, '댕댕이의 지갑에서 냥냥이의 지갑으로 1BTC으로 전송' 의 거래 내용이 모든 노드에 전파되게됩니다. 이 때, 올바른 거래로 인정되려면 정말로 쨱쨱이나 꿀꿀이가 아닌 '댕댕이'가 댕댕이의 지갑을 통해 거래를 했다는 게 증명되야겠죠?
아까 공개키 암호 방식의 (2)의 경우가 이 때 사용됩니다. 댕댕이가 개인키로 거래 내용을 암호화해서, 본인의 공개키와 함께 암호화된 메세지를 모든 노드에 전파하게 됩니다. 다른 노드들이 댕댕이의 공개키로 암호화된 메세지를 복호화를 해봤을 때, 복호화가 된다면 댕댕이는 분명 본인의 개인키로 암호화했다는 것이 증명되면서 정말로 댕댕이가 돈을 보냈다는 것을 확인할 수 있습니다.
여기서 댕댕이가 공개키를 같이 보낸다고 했는지, 실제로 비트코인 상에서는 공개키를 같이 보내지는 않습니다. 어떻게 확인할 수 있을까요? 바로 지갑의 주소가 공개키와 일대일 대응이 됩니다. 공개키를 해쉬 함수를 거치면 지갑의 주소가 되는 것이지요. 즉, 지갑의 주소가 공개키 역할을 한다고 보시면 됩니다.
3. 정리
트렌젝션이 발생하는 과정을 다시 정리하자면, 댕댕이는 냥냥이의 지갑주소(공개키)에게 돈을 보낸다고 적으면서, 개인키로 암호화해서 트렌젝션을 만듭니다. 이 것을, 개인키로 서명(Sign)을 한다고 합니다. 해당 트렌젝션은 모든 노드로 퍼지면서, 댕댕이가 서명을 했으므로 댕댕이가 보냈다는 것을 확신할 수 있고, 냥냥이는 블록 생성 후, 본인의 지갑에 돈이 들어온 것을 확인할 수 있게 됩니다.
여기서, 냥냥이가 아닌 사람이 냥냥이의 지갑에 접근해서 돈을 빼면 안되겠죠? 이 때, 1의 (1)번 경우가 적용됩니다. 개인키를 가진 냥냥이만이 냥냥이의 지갑에 접근할 수 있는 것이지요. 따라서, 개인키를 분실하거나 노출되었을 경우 그 지갑은 영원히 못 찾거나, 바로 돈을 털릴 수 있는 것입니다.
이상, 블록체인에 적용되는 공개키와 개인키에 대해서 알아보았습니다! 글을 쓰면서, 제 머릿속으로도 원리가 정리가 되네요 ㅎㅎ 많은 도움이 되었으면 좋겠습니다!
그럼, 이댕댕으로 놀러왕~!
짱짱맨 호출에 출동했습니다!!
짱짱맨 프로젝트 정말 감사합니다ㅠㅠ 뉴비에게 정말 큰 힘이 되네요ㅠㅠ