본문으로 바로가기

개인키/공개키와 지갑 주소

category 비트코인/Bitcoin Core 2018. 3. 2. 21:51

블록체인상에서의 모든 거래는 블록체인에 포함되기 위해서 유효한 서명이 있어야 하고 이러한 서명은 유효한 디지털 키가 있어야 합니다.

키는 개인키(Private key), 공개키(Public key)  쌍으로 구성되는데, 공개키는 은행의 계좌번호에 해당하고, 개인키는 계좌의 비밀번호(PIN 번호)에 해당됩니다.

블록체인의 지갑에는 이와같이 개인키/공개키의 쌍이 저장되며, 여러개가 동시에 저장이 될수 있습니다.

지갑주소는 공개키를 사용하여 생성이 되며, 생성순서는 다음과 같습니다.


Private키를 사용하여 타원곡선 곱셈함수를 통해 Public 키를 생성하고, Public 키를 Hash 함수를 통해 bitcoin 주소를 생성합니다.

각각의 변환은 단방향으로 각각 역방향으로의 디코딩이 불가능합니다.

즉, Bitcoin 주소를 통해 Public 키를 추출하는것이 불가능하고, Public 키를 통해 Private 키를 추출하는것이 불가능하다는 것입니다.


[참조 : Mastering Bitcoin]


1. 개인키(Private key)


Private 키는 무작위로 추출한 단순한 숫자로 구성되어 있습니다.

Private 키로 사용할 256비트의 난수는 프로그래밍 언어가 제공하는 단순한 난수 생성기를 사용하지 말고, 암호학적으로 안전한 의사난수생성기를 사용하여 생성되어야 합니다.

절대 중복되지 않음을 보장해야 하며, 비트코인에서 키를  생성하는 작업은 1에서 사이의 숫자를 선택하는것과 동일합니다.

따라서 Private 키는 256비트 길이의 숫자로 생성되며, 다음과 같이 64개의 16진수로 표현됩니다.


  Private key : 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD


Private 키는 다음과 같이 3가지의 포맷으로 나누어지고, 3개 포맷은 서로 쉽게 변환이 가능합니다.


 유형

접두부 

설명 

 Hex

없음

 64개의 16진수

  ex) 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

 WIF

 5

 Base58Check 엔코딩

  ex) 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

 WIF-압축형

 K 또는 L

 Base58Check 엔코딩, 인코딩전 접미부 0x01 추가

  ex) KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ



2. 공개키(Publick key)


Public 키는 타원곡선 곱셈함수를 통해 Private 키로부터 계산됩니다.




K = k * G  (K : Public 키, k : Private 키, G : 생성포인트 상수)


위의 식으로 타원곡선곱셈함수를 통하면 Public 키가 계산됩니다.

 

  K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G


계산을 통해 K는 다음과 같이 정의됩니다.


  K = (x, y)

   x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

   y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB



즉 공개키는 한쌍의 (x, y) 좌표로 구성된 점으로 타원곡선상에 존재하고 최종적으로 다음과 같이 표현됩니다.

접두부 04로 시작하고 연속된 256비트의 x,y 숫자 2개로 표현됩니다.


  K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A↵

   07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB


위의 포맷으로 구성될 경우 하나의 Public 키는 520비트의 공간이 사용되는데, 대부분의 거래에는 비트코인 소유주의 자격을 검증하고 비트코인을 소비하는데 필요한 공개키가 포함됩니다.

따라서 저장공간을 줄이기 위해서 공개키 포인트의  x좌표만 저장하고, y좌표는 생략해서 저장공간을 줄이는 방식으로 Public 키를 표현하고 있습니다.

y좌표는 다음의 수식으로 계산이 될수 있기 때문입니다.



비압축 공개키는 04의 접두어를 가지는 반면, 압축  공개키는 02, 03 의 접두어를 가지게 됩니다.

방정식이 y의 제곱으로 구성되어 있기 때문에 x 값은 음수와 양수 2개의 값을 가질수 있기 때문입니다.


다음은 위의 비압축 공개키를 03 접두어를 사용하는 압축 공개키로 표현한것입니다. 


  K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A 



3. 비트코인 주소(Address)


하나의 Private 키를 통해서 압축 Public 키는 2개가 만들어질수 있으며, 각각의 Public 키를 통해서 2개의 비트코인 주소가 만들어질수 있습니다.

즉 하나의 Private  키를 통해 2개의 비트코인 주소가 만들어질수 있지만, 각각의 주소는 동일한 Private  키에 대응된다고 볼수 있습니다.


공개키로부터 비트코인 주소를 만드는데 사용하는 알고리즘은 보안해시 알고리즘(SHA)과 RACE Integrity Primitives Evaluation Message Digest(RIPEMD) 입니다.

비트코인에서는 다음과 같이 Public 키를 사용하여 SHA256 해시를 구하고, 그 결과값의 RIPEMD160 해시값을 산출합니다.


  A = RIPEMD160(SHA256(K)) : K = Public 키 


이렇게 구한 160비트의 해시값은 Base58Check 인코딩을 통하여 사용자들에게 제공됩니다.

Base58Check 인코딩은 58개의 문자와(123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz) Checksum 을 이용하여 사람이 읽을수 있는 문자로 바꾸어 혼란을 방지하고, 거래의 표기나 항목에 대한 에러가 발생하지 않도록 합니다.


이렇게 구한 값이 다음과 같이 숫자 '1'로 시작되는 비트코인의 지갑주소 입니다.


  1thMirt546nngXqyPEz532S8fLwbozud8



전체과정을 그래픽적으로 표현한 주소생성기를 참고로 전체과정을 표현하면 다음과 같습니다.