우리가 비트코인을 전문가 수준으로 이해할 필요는 없습니다. 비트코인의 기본은 암호학으로 구성되어있지만 그렇다고 모든 암호학 이론을 배울 필요는 없습니다. 그래도 비트코인 시스템을 이해하기 위해서는 기초적인 암호 이론을 알아야 할 필요가 있습니다. 이해를 위해서 쉽게 설명하겠으나, 이럴 경우 오히려 혼란이 야기될 수 있는데, 이는 대부분 수학적인 방법으로 해결된다고 생각해주세요.
공개키 암호를 알아보기 전에 기본적인 암호 시스템을 이해해야 합니다. A와 B가 메일을 주고받고, 중간에 E라는 해커가 존재한다고 가정하겠습니다. A가 B에게 메일을 전송하게 되면 E는 전송 도중에 메일을 탈취할 수 있습니다. 따라서 A는 메일을 암호화하여 E가 읽지 못하게 해야 합니다. 하지만 B는 읽을 수 있어야 하므로, A와 B는 사전에 암호화, 복호화(해독) 할 수 있는 키(Key)를 공유합니다. 이제 A와 B는 키를 사용하여 메일을 암호화, 복호화 할 수 있고, E는 키가 없기 때문에 메일을 복호화할 수 없습니다.
그런데 여기서 문제는 결국 키도 메일처럼 주고받아야 공유할 수 있다는 점입니다. E는 키를 주고받는 그 순간을 노려 키를 탈취할 수 있습니다. 이를 해결 할 수 있는 방법으로, 키를 공유하지 않아도 되는 공개키 암호가 등장합니다. 공개키 암호에는 키가 두 개 존재합니다. 다른 사람들에게 공개할 수 있는 공개키(Public Key)와 자기만 알고 있어야 하는 개인키(Private Key)입니다. 이렇게 두 키의 특징은, 공개키로 암호화했다면 개인키로만 복호화 할 수 있고, 개인키로 암호화 했다면, 공개키로만 복호화 할 수 있습니다(이상해 보이지만 수학적으로 가능합니다).
A와 B가 공개키 암호를 사용하여 메일을 주고받는다고 가정하겠습니다. A와 B는 서로 공개키와 개인키를 가지고 있습니다(총 4개). A는 B에게 메일을 보내기 전에 B의 공개키를 가져와 암호화합니다. 공개키는 이전에서 언급했듯이, 공개되어 있기 때문에 누구나 가져갈 수 있습니다. 암호화된 메일을 전달받은 B는 암호문을 자신의 개인키로 복호화하여 메일을 읽을 수 있습니다. 해커 E는 메일을 탈취하더라도 B의 공개키로 암호화되어있기 때문에 B의 개인키가 필요합니다. 하지만 B의 개인키는 B만 알고 있기 때문에 메일을 복호화할 수 없습니다. 이것이 바로 공개키 암호입니다.
해시 함수는 다양한 크기의 데이터를 고정 크기의 데이터로 압축하는 함수입니다. 해시 함수를 통해 나온 고정 데이터를 해시값이라고 합니다. 해시 함수의 특징은 입력한 값이 같으면, 출력되는 값도 같아야 한다는 점입니다. 만약 입력값이 조금이라도 달라진다면 출력값은 완전히 다른 값이 되어 입력된 데이터가 변조되었다는 사실을 금방 알 수 있습니다. 또한 데이터가 아무리 크더라도 해시함수를 거치면 조그마한 고정 데이터값으로 나오기 때문에 서로 주고받기도 편하다는 점이 있습니다. 또 다른 큰 특징으로는 한번 해시 함수를 통과하면 원래 데이터를 알 수 없습니다. 공격자는 해시 값을 보고 원래 데이터가 어떤 데이터인지 알 수 없다는 것입니다.
위의 공개 키 암호와 해시 함수 개념을 섞어 만드는 것이 바로 전자서명입니다. 전자서명을 통해 우리는 무결성, 인증, 부인방지의 3가지 문제를 해결할 수 있습니다. 무결성(Integrity)이란 데이터가 위조되었는지 확인하는 것이고, 인증(Authe ntication)이란 통신하고 있는 상대방의 신원을 확인하는 것이며, 부인방지(Non-Repudiation)는 상대방의 행위를 부인할 수 없도록 하는 것입니다.
위의 예시를 그대로 가져오겠습니다. A와 B는 서로 메일을 주고받는 중이고, E는 해커입니다. 여기서 E는 송신되는 메일을 탈취하여 변조시킨 후 보낼 수 있습니다(무결성). 혹은 E가 A인 척을 하며 B에게 메일을 보낼 수도 있습니다(인증). 아니면 A가 갑자기 나쁜 마음을 먹고 이상한 메일을 보내고선 자신이 보낸 메일이 아니라며 시치미를 뗄 수 있습니다(부인 방지). 이러한 문제들을 전자 서명 기술로 전부 해결할 수 있습니다.
원리는 다음과 같습니다. A가 B에게 줄 메일을 B의 공개키로 암호화합니다. 이는 공개키 암호 파트에서 설명해 드렸습니다. A는 이후 암호화하기 전의 메일을 해시 함수에 통과 시켜 메일의 해시값을 만듭니다. 이후 이 해시값을 자기(A)의 개인 키로 암호화 합니다. 그러면 현재 A가 가지고 있는 것은 B의 공개키로 암호화한 메일과 A의 개인키로 암호화한 해시값이 있습니다. 이 둘을 B에게 보냅니다.
메일과 해시값을 받은 B는 이 둘을 복호화합니다. 메인은 자기(B)의 개인키로, 해시값은 A의 공개키로 복호화합니다. 이제 B는 복호화된 메일을 A랑 동일한 해시 함수를 통과 시켜 해시값을 만듭니다. 이렇게 되면 B는 A가 준 해시값과 원래 메일의 해시값을 비교 할 수 있는데, 이를 통해서 메일이 변조되었는지 해시함수의 특성으로 인해 확인 할 수 있습니다(무결성). 또한 A가 준 해시 값은 A의 개인키로 암호화 한 것이기 때문에 보낸 메일이 A 자신이라는 것을 알 수 있습니다(인증 및 부인방지).
비트코인 시스템의 이해 - 작업증명으로 블록체인 보호하기 (0) | 2021.05.07 |
---|---|
비트코인 시스템의 이해 - 블록체인 기술을 이용한 거래 내역 기록 (0) | 2021.05.06 |
비트코인 시스템의 이해 - 전자서명을 통한 비트코인 송금 (1) | 2021.05.05 |
비트코인, 화폐로써의 가치 - 마운트곡스의 파산에 대한 오해 (2) | 2021.05.04 |
비트코인, 화폐로써의 가치 - 정말 비트코인을 화폐로 쓸 수 있을까? (2) | 2021.05.04 |