관리 메뉴

개발이야기

[Mastering Bitcoin] 마스터링 비트코인 내 맘대로 정리 - Ch04 본문

블록체인 /마스터링 비트코인

[Mastering Bitcoin] 마스터링 비트코인 내 맘대로 정리 - Ch04

안성주지몬 2018. 7. 15. 15:24

ch04 Key, Address


비트코인 네트워크 상에서 이루어진 거래가 정당한 것인지 위조된 것인지 어떻게 검사를 할 수 있을까요. 비트코인 네트워크에서는 디지털 키비트코인 주소디지털 서명을 통해 정당한 거래임을 확인할 수 있습니다 ! 아래 사진을 통해서 알 수 있는 것은 Private key(k)를   b통해 Public Key(K)가 생성되고 다시 Public Key를 통해 Bitcoin Address 가 생성된다는 것입니다. 아래 그림에서 각각의 요소들과 생성되는 방법들을 이제 찬찬히 살펴보도록 하죠 !

 


privk_to_pubK_to_addressA

[그림 1] 개인키, 공개키, 주소 변환 과정(이미지 출처 :  Mastering Bitcoin Ch04) 



"Private Key & Public Key"

비트코인 지갑은 한 쌍의 키를 가지고 있습니다. 그것이 바로 개인키(Private Key)와 공개키(Public Key) 입니다. 우선 개인키부터 살펴보죠. 


개인키 (Private Key) 


개인키의 역할은 무엇일까요. 현실세계에서 우리는 수표를 사용할때 서명을 하고 거래를 합니다. 개인키는 서명과 비슷한 역할을 하는데요. 비트코인 상에서 거래가 이뤄지기 위해서는 거래에서 사용되는 돈의 소유권을 증명해야 비트코인을 소비할 수 있죠. 

개인키는 무작위로 추출된 숫자(randomly)로 구성되어 있는 키입니다. 비트코인의 개인키는 숫자에 불과하고 무작위로 추출되었습니다. 개인키는 1에서 n-1 범위면 어떠한 숫자로도 구성될 수 있습니다(여기서 n은 2^256 보다 약간 작은 값입니다). 그래서 여러분은 동전을 던져 앞면이 나오면 0, 뒷면이 나오면 1을 적는 식으로 동전 던지기르 256회 반복하여 0과 1을 기록하여 개인키를 만들 수 있습니다(256비트). 비트코인 소프트웨어는 무작위 숫자를 생성하기 위해 운영체제의 난수생성기를 이용하여 256비트의 난수(무작위 수)를 생성하게 됩니다. 그러나 여러분이 이 난수생성기를 믿지 못한다면 직접 동전을 던져서 직접 난수를 생성하면 됩니다 !   

개인키는 웹 사이트의 비밀번호와는 다르게 잃어버리면 다시 찾을 수 없습니다. 그래서 불의의 사고로 개인키를 잊어버린다면 다시 찾을 수 없고 해당 계정의 지갑에 있는 수많은(?) 비트코인은 다시는 찾을 수 없습니다(기억이 되살아나지 않는한). 그렇기 때문에 반드시 개인키는 다른 곳에 기록을 해두셔야 합니다. 저 같은 경우는 온라인 상에 기록하는 것을 믿지 못하여 오프라인 상에 수첩에 개인키를 기록해 놓고 다시 그 수첩을 서랍 어느 곳에 넣어 두어 이중 보안을 통해 관리중입니다. 여러분들도 꼭 개인키를 다른 곳에 백업 해두시길 바랍니다. 

공개키 (Public Key)


그렇다면 공개키는 어떻게 생성될까요? 공개키는 타원곡선 곱셈 함수 (타원 곡선 함수)를 사용하여 개인키로부터 계산됩니다. 타원곡선은 K = k * G 라는 식 (k는 개인키, G는 생성포인트라는 상수, K는 식으로 부터 나오는 공개키를 의미)로 계산할 수 있습니다. 이때 타원 곡선 함수는 역으로 계산할 수 없습니다. 즉 k = K/G 형태로 변환하는 것은 안됩니다.


"K(공개키) = k(개인키) * G"


ecc_illustrated


[그림2] 타원 곡선 함수 
(이미지 출처 :  Mastering Bitcoin Ch04) 


위 그림은 어떻게 K 가 구해지는지 과정을 볼 수 있습니다. 만약 개인키가 2였다면 공개키 K는 2G이므로 위 그림에서 2G로 나타나있는 점이 바로 공개키(K(x,y))가 됩니다.


각각의 kG들을 구하는 과정은 아래 그림을 보면서 설명하겠습니다.

[그림 3] 타원 곡선 함수 예시


위 그림처럼 P1과 P2사이에 접점을 그은 직선은 타원 곡선 그래프에서 P1, P2 를 제외한 임의의 한 점에서 만나게 되어 있습니다. 이 점을 x 축 대칭한 점을 바로 P3라고 합니다. 이 과정은 P3 = P1 + P2로 표현 합니다. 이것을 일반화 하여 타원 곡선 그래프 상에 위치하는 임의의 점 P에 대하여 kP를 구하면 kP = P+P ... + P(k번) 입니다. 다시 말해 타원 곡선 그래프 상에 G를 포함한 접선(tangent linear)을 그어 G가 아닌 타원 곡선 그래프 상에 임의의 접점을 구하여 x 축 대칭(reflect on x-axis)을 시키는 과정을 반복하는 것입니다.


따라서 공개키 K = k * G를 구하는 것은 위의 과정을 k번 반복하여 공개키를 구합니다.


비트코인 주소 (Bitcoin Address)


이제 비트코인 주소를 구하는 방법을  살펴볼까요. [그림1]에서 볼 수 있듯이 비트코인 주소는 공개키에 의해 생성됩니다. 

pubkey_to_address


[그림 4] 비트코인 주소 생성 프로세스 (출처: Mastering Bitcoin ch04)


우선 공개키를 SHA256, RIPEMD160 해시 알고리즘을 걸쳐 160비트의 출력값을 생성합니다. RIMEMD160은 해시 알고리즘의 하나로 160bit의 출력값이 나옵니다. 이렇게 나온 160bit 출력값을 'Base58Check Encode' 과정을 걸칩니다. Base58을 알기 위해서는 Base64를 알아야 합니다. Base64는 소문자 26개와 대문자 26개, 숫자 10개(0~9), '+'와 '/' 등과 같은 특수문자로 구성되어 있습니다. Base58은 Base64에서 숫자 0, 대문자 O, 소문자 L(l), 대문자 I (I), 와 '+', '/' 등의 부호를 쓰지 않은 것입니다. 이렇게 제외된 문자들은 서로 동일하게 보여 혼동이 올 수있는 문자들입니다.


Base58Check Encode 과정을 더 자세하게 살펴보면 아래의 그림과 같습니다.

Base58CheckEncoding

[그림 5] Base58Check Encode Process(출처: Mastering Bitcoin ch04)


우선 Base58Check 포맷으로 전환하기 위해서 Version Byte를 접두부(Prefix)에 추가시켜주어야 한다. Version Byte에 역할은 데이터 유형을 쉽게 찾아볼 수 있게 해준다. 다음으로는 두 번의 해시를 통해 나온 출력값(Payload)에 두 번의 SHA256해시 함수를 적용하여 나온 출력값 32바이트의 해시에서 첫 4바이트만을 따와 'Checksum' 이라는 것을 붙여준다. 'Checksum'은 검사합으로 불리고 역할은 에러 탐지이다. 앞으로는 버전 바이트를 추가하고 뒤에는 검사합을 추가하여 Base58Encode과정을 거쳐 드디어 비트코인 주소가 생성된다. 

Comments