본문 바로가기
프로그래밍/Block Chain

[Bitcoin] 개인키와 공개키

by YuminK 2025. 4. 19.

공개키의 암호법과 암호화폐

비트코인은 사용하는 공개키 암호법으로 '타원곡선 곱셈 함수'를 기본 토대로 삼고 있다. 한 쌍의 키는 개인키와 개인키에서 파생된 공개키로 구성되어 있다. 공개키는 비트코인을 전송받을 때 사용되며, 개인키는 전송받은 비트코인을 소비할 때 사용된다(트랜잭션 서명) 대부분의 지갑에서는 개인키와 공개키를 함께 저장하지만, 공개키는 개인키를 통해 계산할 수 있으므로 개인키만 저장하는 것도 가능하다.  

 

개인키와 공개키

비트코인 지갑에는 쌍으로 구성된 키가 여러 개 들어있고, 각각의 쌍은 개인키와 공개키로 구성되어 있다. 개인키(k)는 숫자로 구성되어 있으며, 타원곡선 함수를 이용하여 공개키(K)를 구하는 것이 가능하다. 

 

개인키

개인키는 무작위로 추출한 단순한 숫자로 구성되어 있다. 개인키에 대한 소유권 및 통제 여부는 해당 개인키에 대응하는 비트코인 주소와 연관된 모든 돈에 대한 사용자 통제의 핵심이다. 거래에서 사용되는 돈의 소유권을 증명하게 되면 비트코인을 소비할 수 있게 되는데, 이때 필요한 서명을 하기위해 개인키를 사용한다. 개인키는 절대 사람들에게 공개되어서는 안 된다. 개인키를 공개하는 경우에는 비트코인에 대한 통제권을 넘겨주는 것과 같다. 

 

공개키

공개키는 타원곡선 곱셈 함수를 이용하여 개인키로부터 계산되고 그 과정을 거꾸로 진행할 수는 없다. K = k * G라는 식에서 k는 개인키, G는 생성포인트라는 이름의 상수이며 K는 결과로 나온 공개키이다. 생성포인트는 secp256k1의 일부로 명시되어 있고 비트코인의 모든 키에 대해 동일한 값을 가진다. 

 

비트코인 주소 

공개키로부터 비트코인 주소를 만드는 데 사용되는 알고리즘은 'SHA'와 RIPEMD'이다. 공개키 K를 가지고 SHA256 함수를 쓰고, RIPEMD160 함수를 쓰면 160비트 크기의 숫자가 생성된다. 

 

Address = RIPEMD160(SHA256(K))

 

Base58Check 인코딩

비트코인 주소는 거의 'Base58Check'라는 인코딩을 통해서 사용자에게 제공된다. Base58Check는 58개의 문자와 검사합(checksum)을 이용하여 사람이 읽을 수 있는 문자로 바꾸어 주고 비슷한 문자를 제거하여 혼란을 방지해준다. (0, O, l, I, +, / 등의 문자를 사용하지 않음) 검사합(checksum)이란 인코딩되고 있는 데이터의 끝부분에 추가되는 4바이트 크기의 값이다. 검사합은 인코딩된 데이터의 해시로부터 생성된다. 

 

(1) 데이터를 Base58Check 포맷으로 전환하기 위해서는 데이터에 '버전 바이트'라고 불리는 접두부를 붙여야 한다.

(2) 다음으로 double-sha 검사합을 산출한다. (sha256을 2번 실행) 

checksum = sha256(sha256(prefix + data))

(3) 결과로 나온 32비트 해시에서 첫 4바이트를 따온다. 이렇게 구한 검사합을 끝부분에 연결한다.

(prefix + data + first 4byte of checksum) 이후에 base58 인코딩을 거쳐 비트코인 주소를 구한다. 

 

출처: 마스터링 비트코인 챕터 4

댓글