brunch

[4-1 부록] 비트코인 주소 생성 과정 심화

초보자가 단번에 이해하기에는 다소 진입 장벽이 있어 본문에서는 다루지 못했거나 가볍게 언급하고 넘어간 부분 중 비트코인을 기술적으로 깊게 이해하는데에 도움이 될 수 있는 내용을 따로 분류하여 부록으로 만들었습니다.

쉽고 빠른 이해를 위해 해당 글을 넘기셔도 전체적인 맥락을 따라가는 데에 지장은 없습니다.

비트코인 주소의 생성과정


다음은 비트코인 주소가 생성되는 과정이다.

다루는 내용의 기술적 개념이 생소하고 어려울 수 있으나, 처음 접하는 독자를 염두에 두고 작성하였기에 시간을 두고 정독하면 충분히 소화할 수 있으리라 기대합니다.


mbc2_0401.png image source: Mastering Bitcoin

1. Private Key(개인/비밀 키) 생성


비트코인의 개인키는 통장의 인감도장과 같은 역할을 한다.

사용자는 이를 이용해서 비트코인에 대한 소유권을 증명하고, 사용할 수 있다.


개인키는 간단하게 64개의 알파벳(a~f)과 숫자(1~9)로 표현된 랜덤 숫자라고 할 수 있다.

예). 064b18aec335291e805c624d3721cd21f08d4aa8963bb9db6fbd5ad49df3bbc3

*주의: 절대 위 개인키를 실제로 사용하지 말 것. 이미 노출된 비밀번호와 다름없는 상태.

랜덤 숫자인 개인키가 알파벳으로 표현될 수 있는 이유는 다음과 같이 a~f의 알파벳을 16진법으로 변환할 수 있기 때문이다.

a -> 1010
b -> 1011
c -> 1100
...

1부터 9까지의 숫자로 표현된 부분도 1 -> 0001, 2 -> 0010처럼 16진법 변환을 거치기 때문에, 실제 개인키는 256개의 0과 1로 이루어진다.


개인키를 사용자가 직접 생성하는 방법도 있지만, 보안과 편의상의 이유로 개인키 생성 작업은 주로 비트코인 지갑 소프트웨어가 랜덤으로 대신한다.


2. Public Key(공개키) 생성


비트코인의 공개키는 계좌의 통장과 같은 역할을 한다.

잘 숨겨야 하는 개인키와 달리, 공개키는 다른 사람과 공유해도 문제가 되지 않는다.

통장을 남에게 보여줄 수는 있지만, 통장만으로 출금을 승인할 수는 없기 때문이다.


공개키는 Elliptic Curve Multiplication(타원 곡선 곱셈)를 통해서 생성된다.

이 곱셈법은 앞서 배웠던 SHA256 해시 함수와 같이 단방향 계산만 가능하고 역추산이 불가능하다.


K공개키, k개인키, G를 아래 타원 곡선 사진 위의 임의의 고정점이라고 놓는다면 K를 구하는 식은 다음과 같다.

K = k*G

G라는 점을 개인키의 크기인 k번만큼 곱해야 한다는 설정인데, 이 과정에서 kG를 구하기 위한 곱셈과 덧셈은 매우 특이한 방법으로 이루어진다.

mbc2_0404.png image source: Mastering Bitcoin

가령 필자의 개인키가 2라고 한다면, 구해야 하는 공개키 K2G가 된다.


위 그림을 참고하여 G라는 고정된 점에서 G의 2배인 2G를 얻으려면 다음과 같은 과정을 거쳐야 한다.

1. G를 접하는 tangent(접선)을 그어 만나는 점인 -2G를 찾는다.

2. -2G를 가로축에 대하여 대칭이동(reflection on x-axis)하여 2G를 구한다.

2G에서 같은 방법을 사용하면 2G의 2배인 4G를 구할 수 있다.

1-ezgif.com-webp-to-jpg-converter.jpg image source: An Introduction to Elliptic Curve Cryptography | Medium

만약 위 그림에서 특정 점 PQ를 더하고 싶다면 아래와 같은 방법을 사용한다.

1. P와 Q를 동시에 지나는 선을 그린다.

2. 해당 선이 타원 곡선과 만나는 세 번째 점인 -R을 찾는다.

3. -R을 가로축에 대하여 대칭이동하여 R을 구한다.


이렇게까지 특별한 방법으로 공개키를 생성하는 이유는 보안에 있다.


비트코인 수신을 위해 생성한 공개키를 통해 역으로 개인키를 생성할 수 있다면, 누군가 내 지갑에 대한 소유권을 행사하여 보유하고 있는 비트코인을 도난당할 수 있기 때문이다.


따라서 비트코인은 타원 곡선 암호를 통해 개인키 보유자가 쉽게 공개키를 생성할 수 있도록 하는 한편, 누군가 반대로 역추산을 할 수 없도록 하는 단단한 암호 체계를 구축하였다.


3. Bitcoin Address(비트코인 주소) 생성


비트코인의 주소는 통장에 적힌 계좌번호라고 할 수 있다.

남에게 계좌번호를 알려주는 것과 같은 맥락으로, 주소를 알려줌으로써 비트코인을 입금받을 수 있다.


주소는 실제로 비트코인을 수신해야 하기 때문에 다음과 같은 특성을 지녀야 한다.

1. 모두에게 공개되더라도 개인키를 역추산할 수 없어야 한다.

2. 쾌적한 사용자 경험을 위해 적당한 길이를 유지해야 한다.

3. 주소 오입력으로 인한 비트코인 손실을 최대한 방지해야 한다.
*잘못된 주소로 비트코인을 전송할 시 아무도 복구할 수 없다.

1~3을 모두 만족하기 위해, 비트코인 주소는 다음과 같은 생성 과정을 거친다.

(하단 그림 참고)

mbc2_0405.PNG image source: Mastering Bitcoin(edited)

3-1). 공개키를 SHA-256 함수에 입력


타원 곡선 암호를 통해 생성한 공개키를 SHA-256 해시 함수에 입력하는 과정이다.

이 과정에서 해시 함수는 공개키의 값을 고정된 길이로 압축시키고 보안을 더하기 위한 목적으로 사용된다.


앞서 배웠던 SHA-256 해시 함수 개념이 아직 생소하다면 링크를 통해 복습할 수 있다.


3-2). 3-1에서 나온 값을 RIPEMD-160 함수에 입력


SHA-256 함수를 통해 생성한 값을 RIPEMD-160 해시 함수에 입력하면 주소 생성에 기반이 되는 데이터를 구할 수 있다.


RIPEMD-160 해시 함수는 SHA-256 함수와 유사한 원리로 작동하지만, 보안을 위해 주소 생성에 사용된다.


서로 다른 a, b 값을 함수에 넣었을 때 모두 c라는 결과를 출력하는 경우를 충돌현상이라 부른다.


RIPEMD-160 해시 함수는 SHA-256 함수에 비해 충돌 저항성이 강하기 때문에 같은 주소에 대해 여러 소유자가 발생할 수 있는 오류를 미연에 방지할 수 있다.


3-3). 3-2에서 나온 값에 대한 Base58 인코딩 진행


3-2 과정에서 생성된 결괏값을 그대로 사용해도 무방하지만, 주소의 종류를 구분하고 사람의 실수로 인한 오입력을 방지하기 위해 Base58 인코딩을 진행한다.


Base58 인코딩 함수는 앞서 다뤘던 다른 함수와 같이 입력값에 대한 결과를 출력하지만, 데이터를 사람이 읽고 쓰기 쉽게 변환한다는 점에서 특별하다.

mbc2_0406.png image source: Mastering Bitcoin

인코딩을 진행하기 위해서는 먼저 3-2의 결괏값을 최종 데이터로 변환해야 한다.


아래 식에서 version(버전)은 비트코인 네트워크의 버전을 뜻하며, checksum(체크섬)이란 버전3-2의 결괏값을 요약한 데이터를 의미한다.

최종 데이터 = (버전)+(3-2 결괏값)+(체크섬)


체크섬을 구하려면 버전과 3-2의 결괏값을 합친 후 SHA-256 해시 함수에 두 번 넣으면 된다. 그렇게 찾아낸 두 번째 함수 결괏값의 맨 앞 일부분을 따서 체크섬이라고 부른다.


체크섬이 존재하기 때문에 만약 주소를 입력하는 과정에서 오타가 일어난다면 (버전) + (3-2 결괏값)과 (체크섬)이 일치하지 않아 오입력을 쉽게 발견할 수 있다. 이는 대부분의 지갑 애플리케이션이 자동으로 계산한다.


그렇게 출력한 최종 데이터Base58 인코딩 방식을 통해 사람이 읽을 수 있는 수준의 문자열로 변환하면 비트코인 주소를 얻을 수 있다.


참고문헌


Antonopoulos, Andreas. Mastering Bitcoin, 2nd Edition. O’Reilly Media, Inc, 2017.


Elusiv Privacy. “An Introduction to Elliptic Curve Cryptography.” Medium, Medium, 7 Dec. 2023, medium.com/@elusivprivacy/an-introduction-to-elliptic-curve-cryptography-19a6e5752fcf.

keyword
매거진의 이전글4-1. 비트코인 지갑과 소유권 개념 (상)