Leo's Garage

Mastering Bitcoin 2nd - Programming The Open BlockChain Ch.4-1 본문

BlockChain/Mastering Bitcoin

Mastering Bitcoin 2nd - Programming The Open BlockChain Ch.4-1

LeoBehindK 2018. 8. 19. 21:24
728x90
반응형


Ch.4 Keys, Addresses에 대해서 포스팅을 하겠다.


그동안 출장, 다른 일 때문에 바빠서 포스팅이 많이 늦어졌다. 

흩으러진 마음을 다잡고 다시 심기 일전하며 Ch.4를 정리하도록 하자.



Cryptography means "secret writing" in Greek, but  the science of cryptography encompasses more 

than just secret writing, which is referred to as 

encryption.



그렇다 암호화폐에서 말하는 Cryptography의 핵심은 '암호화'이다.
이 장에서는 우리는 비트코인의 자금에 대한 소유권을 행사하는데 사용되는 몇 가지 암호기술을 소개할 것이다. 

(그런데 사실, 비트코인 어플리케이션에서 통신과 거래 데이터는 암호화되어 있지 않고, 암호화할 필요가 없다! 그렇다면 어디에 암호화 기술이 필요하다는 것일까?)



Ownership of bitcoin is established digital keys, 

bitcoin addresses, and digital signatures.



비트코인의 소유권은 디지털 키와 비트코인 주소 그리고 디지털 서명으로 성립된다. 

 이 디지털 키는 사실 비트코인 네트워크 상에 저장되어 있지 않고, 유저가 관리하는 개인파일 속에서 또는 지갑이라 불리는 간단한 데이터 베이스 안에 보관되어 있다. 

실제로 유저의 지갑 내에 있는 디지털 키는 비트코인 Protocol과 완전히 독립적이며 지갑 소프트웨어는 인터넷의 연결 혹은 비트코인 레퍼런스 없이도 생성이 가능하다. (완전히 독립적이라는 말이다.)

이 키는 쌍(in pairs)으로 구성되는데 Private (secret) key와 Public Key이다. (아마 블록체인 거래를 해본 사람이라면 들어봤을 것이다.)



 Private Key

 secret PIN, signature on check

 Public Key

 bank account number



비트코인 거래의 영역에 있어서는 비트코인 수신자의 Public Key는 비트코인 address와 연관되며, 이 비트코인 address는 실제로 Public Key로부터 생성되어진다.

Public Key와 Private Key의 사이에는 어떤 수학적인 관계가 있다. 이 관계덕분에 Private Key는 거래 메시지 상에서 Signature를 생성하는데 사용할수 있게 된다. 

예를 들어서, 비트코인을 사용하고자 할 때, 현재 비트코인 소유자는 자신의 Public Key와 Signature(매 순간 다르지만, 같은 Private Key에서 생성된)를 제시함으로써 거래에 해당 비트코인을 사용할 수 있다. 

자 그럼 이 Private Key와 Public Key가 어떻게 생성되어지는지 알아보도록 하자.




위 사진에서 보다시피, Private Key(k)는 PRNG(Pseudo-Random Number Generator; 의사 난수 생성기)를 통해 무작위로 추출된 숫자로 구성된다. 

Public Key(K)는 단반향 암호함수인 Elliptic Curve Multiplication(타원 곡선 알고리즘)을 이용하여 생성된다.

그리고 Bitcoin Address(A)는 Hashing Function(해시함수)를 이용하여 생성한다. 



Private Key

간단하게 생각하자. 비트코인의 Private Key를 생성하는 작업은 '1에서 2의 256제곱 사이의 숫자를 선택'하는 일과 동일하다.

이를 달리 말하면 256bit에 해당하는 무작위 숫자를 추출하여 Private Key로 사용한다는 말이다. 약 10의 77제곱개의 선택지가 가능하다. (이게 얼마나 큰 수냐면, 관측 가능한 우주가 10의 80제곱 개의 원자들로 구성되어 있다!)

[** Private Key는 결국 랜덤함수를 돌려서 그 값을 얻어내는 과정이다. 다만, 개인적으로 Private Key를 생성할 때에 프로그래밍 언어 등에서 기본적으로 제공하는 함수로 생성해서는 안된다. 앞 서 언급한 것과 같이 PRNG라는 함수를 이용해서 생성하기 바란다.]


앞 선 장에서 만들었던 Bitcoin regtest server에서 생성된 Private Key를 확인해보도록 하자.



./bitcoin-cli -regtest getnewaddress



서버에 새로운 주소를 하나 만들도록 하자. 
아래와 같이 주소가 생성되었다. 





아래와 같이 명령을 입력하면



./bitcoin-cli -regtest dumpprivkey 2Mw9rTPviPhViQ6bUbrCmG97ZNLkUFRzo4r





위와 같이 해당 주소의 Private Key를 확인할 수 있다.

다만, 위의 dumpprivkey 명령어는 getnewaddress로 생성된 주소의 private Key를 역 계산한 것이 아니다. getnewaddress로 주소를 생성 시 만들어진 Private Key가 맵핑되어 있는데 해당 값을 그저 호출한 것 뿐이다.

일반적으로 비트코인 네트워크 내에서 타 주소의 Private Key를 확인하는 것은 불가능 하다.



Public Key

Public Key는 Private Key와 elliptic curve multiplication이라고 일컬어지는 타원곡선 암호화를 통해 생성된다. 

일반적으로 아래와 같은 공식으로 이루어진다.

K(Public Key) = k(Private Key) * G(generator point)



타원곡선 암호화는 쉽게 말하면 출발점(Private Key)를 알고 G(generatorPoint)를 알면, K(Public Key)를 생성하기 쉽지만, 반대로 K(Public Key)를알고 동시에 G(generator Point)를 안다고 k(Private Key)를 알기 매우 매우 매우 힘든 알고리즘이다. (이런걸 Trap Door라고 한다.)

물론 불가능하지 않다. 다만 그것을 찾아내기가 매우 힘들기 때문에 보편적으로 비가역적이라고 말한다. 




ㅇㅇTrap Door라고 한다


(Trap Door - 한 쪽 방향에서는 열기 쉽지만, 반대 방향은 그렇지 않다)





타원곡선는 위의 수식을 만족하는 점들의 집합이다.

우선 필자는 배경지이 부족하여 이 내용, 즉 Elliptic Curve Cryptography (타원 곡선 암호화)를 이해하는데 굉장히 많은 시간이 걸렸고 현재까지도 이해한 내용이 정확히 맞는지 확신? 까지는 하지 못한다.

관련하여 인터넷에 무수히 많은 내용을 검색해 보았는데 일반적으로 대학교 수학과 학부 수준의 지식이 없는 이공계 공학도 입장에서 접근하기 쉬운 자료는 보이지 않았다. (물론 필자가 찾지 못했거나.. 충분히 쉽게 설명했지만 이해 못했을 수도 있다.)

지금까지 필자가 이해한 내용을 토대로 최대한 접근하기 쉽게 설명하도록 하겠다. (혹시라도 잘못된 내용이 있다면 언제든지 지적해주길 바란다.)


위에서 설명했듯이 타원곡선는 참 특이한 형태를 가지고 있다.
우리 수학자들은 이러한 곡선을 가지고 놀다보니 특이한 성질을 찾아냈는데 바로 "임의로 정의된 어떤 연산공식에 대해서는 타원곡선이 닫힌 계"라는 것이다. 


이게 무슨 말인가? 자 이제 천천히 이해해보자.




위와 같은 임의의 타원곡선이 있다고 하자. 
타원 곡선의 특징 중 하나는 타원 곡선 위에 있는 두 점 (P1, P2)를 지나가는 직선을 그었을 때, 이 직선은 다른 한 점(P3')를 지난다는 성질이 있다. 
(쉽게 생각하면 삼차 방정식의 해라고 생각하자 물론 중근도 존재한다.)

여기서 P3'은 그림 상의 P3와 X축 대칭에 있는 점이다.



여기서 우리는 한 가지 약속을 정하고 갈 것이다.

적어도 타원곡선 내에서는  P1 + P2 = P3라고 해보자

(* 주의, 여기서 +는 우리가 하는 덧셈이 아니다, 임의로 약속한 기호이다)


그리고 이에 대한 공식화를 해보도록 하자.



즉, P, Q라는 두 점이 E(타원 곡선) 위에 있다면, 그리고 각각 P=(x1,y2), Q=(x2, y2)라고 한다면 R(x3, y3) = P + Q는 존재한다.





위와 같은 경우로 표현될 수 있으며, 위의 연산 (+)는 타원 곡선 내에 항등원과 그에 대한 역원을 가져 (1) 교환법칙과 (2) 결합법칙이 성립한다.

자세한 수학적 증명은 넘어가도록 한다. 궁금하신 분은 아래 링크를 타고 들어가서 확인해보록 하자.


https://namu.wiki/w/타원곡선


자 여기까지 잘 따라 왔으면 거의 다 왔다. 

위의 두번째 그림에서 볼 수 있듯이 중근(P = Q)인 R은 아래와 같이 표현될 수 있다.

P + Q = 2P = R

여기서 한 번 더 

R + R = 2R = 4P =T

R의 접선에서 출발한 직선은 타원 곡선의 어딘가에 닿았으며 그곳을 T라고 했을 때 우리는 4P라고도 볼 수 있다.

이런 성질을 이용하여 타원곡선 내를 + 연산을 통해 계속해서 이동한다면

kP = P + P + P + P ... + P = K (k times)

위와 같이 표현 될 수 있다.

자 여기까지가 타원곡선의 성질에 대한 부분이다. 


이러한 타원 곡선을 암호화로 사용하기 위해서는 실수의 영역에서는 사용하기 힘들다 (타원 곡선에 해당하는 점이 무수히 많기 때문에)

그래서 우리는 타원 곡선 위에 있는 점의 개수를 제한 할 필요가 있다.
그럴 때 사용하는 방식이 바로 타원 곡선을 유한체로 만드는 것이다.

유한체란  집합에 속해 있는 원소의 수가 한정되어 있으며덧셈곱셈 연산에 대하여 닫혀 있는 집합을 의미합니다.  닫혀 있다” 연산의 결과 값도 집합에 속해있다는 것을 의미합니다이를 위해 연산의 결과 값에 대해 특정 수(암호학에선 prime number 사용) p 를 가지고 mod 연산을 합니다유한체를 사용하는 이유는암호연산은 정수를 기반으로 계산해야 하기 때문이라고 합니다참고로타원곡선이 암호학에 적합한 이유는실수(Real Number)상에서 연산을 하든유한체 상에서 연산을 하든동일한 수학법칙이 적용되기 때문이라고 합니다.

[출처] 비트코인에서 사용하는 타원곡선암호기술(ECC)|작성자 AEP코리아네트




어려운 내용이지만 쉽게 설명하면 타원 곡선 위에 무한하게 많은 수를 우리가 정한 숫자만큼으로 제한하겠다는 말이다.

이렇게 하면 마치 채 위에 뿌린 점처럼 타원곡선의 형상이 변하게 된다. 





위의 그림은 타원 곡선의 각 원소를  23으로 제한 했을 때, 보여지는 모습이다. 믿기지 않겠지만 타원 곡선이 맞다.


Bitcoin에서는 secp256k1 curve라고 하는 표준 타원곡선을 사용하는데 이 타원 곡선의 공식은 아래와 같다.

y2 = (x3 +7) over (F256)

여기서  F256이란 위에서 설명한 것과 같이 유한체에 타원 함수를 그리며 각 원소는 256으로 제한된다. (위의 23으로 제한한 유한체에 비하여 복잡도가 훨씬 증가하며 실제로 사이즈도 굉장히 크다)


(오른쪽의 경우가 secp256k1 curve이며 해당되는 점이 굉장히 많은 것을 볼 수 있다.)



자 이제 우리는 점으로 도식화된 타원곡선을 이용하여 Private Key에서 어떻게 Public Key를 생성하는지 보도록 하자.


포스팅의 앞 쪽 부분에서 아래와 같은 공식을 언급한 적이 있다.

K(Public Key) = k(Private Key) * G(generator point)

즉 Public Key는 Private Key와 어떤 G라는 값의 곱으로 이루어진다.

그리고 중간쯤에 우리는 타원 곡선을 이해하면서 아래와 같은 공식을 도출해 냈다.

kP = P + P + P + P ... + P = K (k times)

어딘지 모르게 뭔가 닮은 것 같지 않은가?



자 이 그림을 보자.

그렇다 위 두 식을 합쳐서 생각해보면, 다음과 같이 우리는 Public Key를 타원곡선 위에서 만들 수 있다.

secp256k1 타원 곡선 위에서 특정한 G점에서부터 256bit로 표현된 Private Key만큼의 횟수로 이동하여 간 최종 지점, 바로 그 지점이 Public Key로 나타내어 진다. (즉, (x,y)의 좌표형태로 표현 되어진다.)

앞 서 Trap Door를 언급했는데, 이것은 다음과 같다.

우리가 만약 Private Key와 G값을 안다면, Public Key를 구하는 것은 쉬운 일이다. 왜냐면 단순한 계산 문제이기 때문이다. 하지만 Public Key와 G값을 안다고 Private Key 즉, 몇 번 타원곡선 위를 오갔는지 알아내기란 쉽지 않다. Trap Door는 이런 것을 두고 붙여진 별명이다.

(*G값은 secp256k1에서 표준값을 정해놓았고 항상 같다)

다음 장에서 Bitcoin Addresses 생성과 그 밖에 4장 나머지 부분을 정리하도록 하겠다.




* Block Chain Core or DAPP 개발관련 모임


https://open.kakao.com/o/gLYr7PU


같이 공부하실 분 모십니다 :) 

개발자가 아니어도 좋습니다. 같이 공부해요!


728x90
반응형
Comments