Intro
지난 시간에는 전자서명이 무엇인지 도장과 봉인의 사례로 알아봤어. 오늘은 비트코인에서 전자 서명을 어떻게 하는지 조금 더 구체적으로 알아볼게. 이에 대한 기술적 원리를 완전히 이해하기는 어려워. 하지만 핵심 키워드와 같이 최대한 쉽게 설명할 예정이야.
그리고 결국 비트코인이 신뢰 문제를 해결하기 위해서 왜 전기로 비트코인을 채굴하는 작업증명(PoW, Proof of Work) 방식을 채택하게 되었는지에 대해서도 얘기할게.
Keyword
전자서명, 작업증명(Proof Of Work), 공개키, 개인키(비밀키), 타원곡선함수
짧은 요약
- 개인키는 무작위 난수를 통해, 공개키는 타원곡선함수(ECDSA)를 사용해 개인키로부터 동시에 생성된다.
- 개인키는 비트코인의 소유권을 증명하고 사용을 허가(전자서명)하는데 사용된다.
- 공개키는 비트코인을 받을 때 서명이 개인키로 생성된 것이 맞는지 확인하는 역할을 한다.
- 해시함수는 암호화의 한 방법으로, 입력값의 길이에 관계없이 일정 길이의 문자열로 바꾸어주는 일방향 함수이다.
- 비트코인은 이중지불문제를 비잔틴 장군 문제로 해결했다.
개인키와 공개키, 도대체 무엇일까?
우선, 공개키 암호화 방식(Public Key Cryptography)에 대해서 살펴볼 필요가 있어. 말 그대로, 공개 키와 개인키 쌍을 활용해서 메시지(텍스트, 이미지 등)를 암호화 및 해독하는 시스템을 의미해. 비유를 들면, 공개키는 아래의 이미지와 같이 ‘자물쇠’로 비유할 수 있어. 이 자물쇠는 모두에게 공개되어 있어서 누구든지 사용할 수 있고, 잠글 수만 있고 열 수는 없어. 개인키는 이 자물쇠를 열 수 있는 유일한 열쇠라고 비유할 수 있어. 오직 소유자 자신만이 갖고 있어야 하지.
공개키(좌)와 비밀키(우)
공개키와 개인키는 암호학에서 나오는 복잡한 수학적 과정을 통해 만들어져. 하지만 그 기본 원리는 ‘타원 곡선 암호화’라는 기법을 사용하는데, 이걸 간단하게 설명하자면 아래와 같아.
- 개인키 생성하기
랜덤한 숫자 생성하기 = 개인키
먼저 컴퓨터는 매우 큰 랜덤한 숫자를 선택해. 바로 이 숫자가 개인키 그 자체야.
예시로 든 랜덤 숫자가 8508경이 훨씬 넘는 숫자라는 것을 알 수 있어(출처)
위 랜덤 숫자는 우리가 일상에서 사용하는 십진수 표기법(1,2,3…100)으로 표시된 숫자야. 비트코인 네트워크에서는 256 bit의 엄청 큰 숫자를 생성해서 비밀키로 활용하고 있어. 이 256bit의 숫자를 2진수(binary), 16진수(hexadecimal)로 변형해서 사용해. 같은 숫자이고, 표기법만 다른 셈이지. 그렇다면 왜 표기법을 굳이 다르게 사용할까? 랜덤한 숫자(비밀키)를 생성할 때, 실제 연산은 2진수로 수행되지만 표현이나 저장을 위해 16진수로 변환해서 나타내는 경우가 많아. 16진수는 길이가 짧기 때문에 공간을 절약하고, 사람이 읽기에도 더 편리하기 때문이지.
상단 예시로 든 랜덤 숫자의 2진수 형태(출처)
상단 예시로 든 랜덤 숫자의 16진수 형태(출처)
[참고]
256 bit 숫자는 컴퓨터가 저장할 수 있는 데이터 단위 중 하나야. 이 숫자가 얼마나 크냐면, 0에서 2²⁵⁶ 사이의 숫자가 될 수 있어. 개인키가 만들어지는 경우의 수가 2²⁵⁶가지이기 때문에, 중복 가능성은 극도로 낮아.
개인키로 사용할 수 있는 랜덤 숫자 범위(출처)
개인키를 직접 생성해보는 예시 코드(참고용)
앞서 ‘컴퓨터’가 비밀키를 생성한다고 언급을 했었어. 프로그래밍을 통해 직접 비밀키를 만들어 볼 수 있다는 의미야. 프로그래밍 언어는 아무 언어를 선택해서 프로그래밍 해도 무방해. 이번 글에서는 직관적인 이해를 위해, 파이썬(Python) 언어를 이용해서 비밀키를 생성하는 예시 코드를 추가해 보았어.
출처 : ChatGPT
결국,
무작위 난수를 통해 개인키를 생성하는 것이 비트코인 계좌를 생성하는 것이야. 계좌 생성부터 비트코인 네트워크(프로토콜)에서 진행되는 것이라서 제 3의 중앙 주체(정부, 은행)가 없지.
- 타원곡선함수(ECDSA)를 이용한 공개키 생성
– 추가 —
비트코인의 전자 서명 자세히 알아보기
비트코인에서는 둘 사이에 비트코인을 주고 받았다는 거래를 전자 서명을 통해 검증해. 지난 시간에 왕이 왕을 상징하는 인장을 찍어서 편지를 봉인해 보내는 게 전자서명과 비슷한 방식이라고 했지? 이 프로세스를 비트코인에서는 공개키와 개인키를 가지고 두 사람이 비트코인을 거래했다는 사실을 증명해.
먼저 비트코인을 받을 사람 B가 공개키와 개인키 쌍을 생성해. 쌍을 생성한다는 건 이 때 같이 생성한 공개키와 개인키라는 게 들어맞아야 증명이 된다는 것이지. 공개키와 개인키는 랜덤으로 펼쳐진 문자와 숫자열인데, 영화에서 봤을 법한 ‘a16cfh8325df…..’ 같은 거야. 하지만 우리가 이 복잡한 문자열을 기억할 필요는 없어. 보통 지갑을 통해서 비트코인을 주고 받는데, 대신 내 지갑의 비밀번호와 시드구문은 반드시 기억해야 해. 아마 처음 지갑을 만들 때 반드시 저장하라고 알려준 ‘Whale, June, Blue, …’와 같은 12개나 24개의 영어 단어 리스트를 기억할거야.
개인키는 정말 나 자신만 알고 있는 거라 남에게 공개할 필요가 없어. 나에게 비트코인을 보내줄 A에게는 공개키를 보내야 해. 그게 내 비트코인 지갑의 주소거든. 공개키도 원래는 개인키와 같은 복잡한 문자열인데, 이걸 해시(hash)함수로 암호화해서 우리가 아는 그 비트코인 지갑의 주소로 만들어. 이렇게 해시함수로 암호화하는 걸 보통 해싱한다고 표현하는데, 자주 쓰는 말이니 꼭 기억하도록 하자.
A는 B가 보내준 비트코인 주소인 공개키를 다시 해싱해서 B에게 보내. 중간에 누가 이 키를 도둑질하는 해킹이 일어날 수 있으니 암호화해서 보내는 거야. 여기에는 A가 B에게 비트코인을 송금한다는 내용이 담겨있거든. 처음에 B가 공개키와 비밀키의 쌍을 만든다고 했지? 이걸 받은 B는 맨 처음에 만든 자신의 비밀키를 가지고, A가 보낸 공개키가 B 자신이 직접 만들어서 보낸 공개키가 맞는지 맞춰보는 거야. 맞다는 게 확인 되면 둘 사이의 비트코인 거래가 검증되는 것이지.
해시태그 말고, 해시 함수
비트코인을 공부하려면 해시 함수는 반드시 알고 넘어가야 해. 해시 함수는 내가 마음대로 문자열을 넣으면, 그걸 암호로 만들어 주는 박스라고 생각하면 돼. 그런데 입력값을 넣으면, 딱 고정된 길이로 해시값(이것도 난수의 문자열로 보임)을 뱉어 내지만, 반대로 출력값으로 입력값을 역산할 수는 없어. 무슨 말이냐면, 위 그림에서 나온 고정 길이의 해시값을 다시 해시 함수 박스에 넣는다고 해서, 내가 처음에 넣었던 ‘helloworld!@#$’’을 뱉어 내지는 못한다는 뜻이야. 그러니까 해싱되어 나온 문자열 값을 안다고 해서, 내가 맨 처음에 넣은 비밀번호 같은 문자 ‘helloworld!@#$’를 알아낼 수는 없다는 것이지. 암호화의 한 방법이야. 비트코인에서는 SHA 256함수를 사용해. 보통 ‘샤256’이라고 읽어.
비잔틴 장군 문제
하지만 이 전자서명만으로는 이중 지불 문제를 해결할 수 없어. 전자서명만 있으면 비트코인 소유자만에게만 트랜잭션이 발생하거든. 그러니까 첫번째 이미지에서 A가 B에게 비트코인을 보냈다는 거래 증명은 B만 가지고 있는 거야. A는 비트코인을 보냈을 뿐, 개인키를 가지고 검증하는 건 비트코인을 받은 B거든. 그럼 A가 악의를 가지고 1비트코인밖에 없으면서, B에게도, C에게도, D에게도 1비트코인을 마구잡이로 보낼 수 있어. 누구도 A가 이미 가진 비트코인 전부를 보내버려서 비트코인이 하나도 없다는 걸 증명할 수 없거든. 이걸 이중지불 문제라고 불러.
비트코인은 이중지불 문제를 비잔틴 장군 문제로 풀어냈어. 성을 공격하는데 모든 장군의 부대가 합심해서 공격해야 성공할 수 있어. 총공격을 하라고 왕이 명령을 내렸고 장군들은 옆 부대에 그 메시지를 전달해. 명령 전달이 중앙화된 게 아니라 분산된 것이지. 그런데 중간에 배신자가 생겨서 공격하지 말라고 다른 메시지를 전달해버리는 거야. 하지만 이 경우 배신자의 비율이 1/3보다 적으면, 충신이 2/3 이상이면 배신자를 색출할 수 있어. 다수를 차지한 2/3의 충신들이 왕은 9시에 공격하라고 명령했고, 우리가 그 명령을 전달했다고 하면 그 다수의 말을 신뢰할 수밖에 없지. 배신자가 발생할 수는 있어도, 절대 다수가 충신이기만 하면 배신자의 나쁜 행동을 막을 수 있다는 취지야.
그런데 이런 방식은 매우 폐쇄적인 시스템이야. 장군들의 수는 왕이 임명한 장군으로 한정되어야 하잖아. 아무나 장군으로 들어올 수 없지. 비트코인은 여러 사람(=노드)이 마음대로 시스템 안에 들어왔다가 나갈 수 있는 개방형 네트워크를 지향하거든. 누구의 허락도 받을 필요 없이 마음대로 비트코인 채굴도 하고, 노드를 돌리며 작업을 검증 할 수 있어야 한다는 의미야. 이런 개방형 네트워크를 위해서는 새로운 알고리즘이 필요한데, 이것이 비트코인 채굴에 사용하는 작업증명(PoW, Proof of Work) 방식이야.
비트코인의 꽃이라고 할 수 있는 작업증명에 대해서는 다음 시간에 다뤄볼게.
출처: 루디움(https://ludium.world),
출처: 루디움(https://ludium.world),
디애셋 프로(https://contents.premium.naver.com/digitalasset/digitalassetpro)
작성자: Koo (@koorypto)
크립토가 세상을 바꿀 수 있다고 믿는 낭만파
작성자: Blynn(@0xBlynn)
전통금융과 크립토 이슈에 관심이 있어 이에 기여하고 싶은 사람.
📍더 알아보기 : https://t.me/coiniseasy
📍코인이지 앱 :
IOS- https://apps.apple.com/us/app/coineasy/id6463145391
Andoid - https://play.google.com/store/apps/details?id=com.coineasy.coineasy
댓글 4개
Slowpoke82
2024.05.13 19:13:13
잘 봤습니다
코인이지
2024.05.14 17:38:27
감사합니다
다사랑
2024.05.13 17:27:16
감사합니다.
코인이지
2024.05.14 17:38:29
감사합니다
2024.05.09 13:01:43