본문 바로가기
블록체인/크립토 월렛

09. 크립토 월렛의 개인키 관리 분석 - 크립토 월렛의 개인키 생성 프로세스

by 비트코기 2023. 9. 30.

크립토 월렛 분석과 검토를 통한 개인키 관리 및 사례 연구

04. 크립토 월렛의 개인키 관리 분석


제1절 크립토 월렛의 개인키 생성 프로세스

1. 키 생성 프로세스 개요

크립토 월렛의 기본적인 기능 중 하나인 암호화폐를 관리하기 위해 공개키 암호 기술과 해시함수를 이용하여 키를 생성·관리한다. 크립토 월렛에서 키를 생성할 때 랜덤한 숫자인 개인키를 생성하고 수학적 계산을 공개키를 생성한다. 이렇게 만들어진 공개키를 해시함수를 이용해 각각의 암호화폐에서 사용하는 주소를 만들게 된다. 이러한 모든 계산은 일방향인 특성이 있어 역산이 거의 불가능하다.

 

<그림 1-1> 개인키, 공개키, 주소의 관계

 

2. 개인키 생성

개인키는 비밀키라고도 하며 256비트 길이의 난수로 구성된 값이다. 키 생성 요청이 들어오면 거대한 난수표에서 무작위로 값이 선정된다. 보통 이 숫자는 64자리의 16진수로 표현된다.

 

이때 난수를 선정하는 알고리즘이 매우 중요하다. 난수 생성기의 품질이 떨어질 때 가장 중요한 개인키값을 예측할 가능성이 커지기 때문이다. 개인키로 서명한 트랜잭션을 공개키를 이용하여 검증하기 때문에 개인키가 외부에 노출되면 타인이 임의로 생성한 트랜잭션에 유효한 서명을 할 수 있게 되고 이는 곧 노출된 개인키로 통제되는 모든 자산을 잃을 수 있다는 의미이다.

 

<그림 1-2> 개인키 생성 과정

 

개인키 생성은 보안이 철저한 엔트로피 소스(Entropy Source), 즉 무작위성을 찾는 것이 중요하다. 이렇게 생성된 256비트의 엔트로피(Entropy)가 n-1보다 작은지 확인한다. 여기서 n은 비트코인에서 사용된 타원곡선의 유수(Order)라고 정의된 상수를 의미한다. (n = 1.158 * 1077, 2256 보다 약간 작은 값) 생성된 엔트로피가 n-1보다 큰 경우 SHA256 해시함수를 이용해서 256비트의 숫자를 생성한다. 이때도 n-1보다 크면 다른 난수를 이용해 다시 생성한다.

 

이렇게 생성된 개인키는 여러 가지 방법으로 표현할 수 있다. 32바이트의 숫자 값을 그대로 보여주거나 64개의 16진수로 보여준다. 이러한 16진법 포맷과 가공하지 않은 2진법 포맷은 애플리케이션 내부에서 사용하거나 사용자에게 거의 보이지 않는다. 일반적으로 Base58 검사합(Checksum)으로 인코딩 된 포맷인 WIF(Wallet Import Format) 형식으로 보여주는데 크립토 월렛 간의 Export/Import에 사용되거나 개인키의 QR Code 구현에 종종 사용된다. WIF 포맷 외에 WIF-압축 포맷이 존재하는데 접두어로 ‘K’나 ‘L’을 사용하고 내부에 있는 개인키가 접미부 ‘01’을 가진 압축 공개키를 생성하는 데 사용된다.

 

3. 공개키 생성

공개키는 타원곡선 곱셈 함수를 이용해서 개인키로부터 계산되며 그 과정을 거꾸로 진행할 수 없다. 즉 개인키로 생성된 공개키를 이용해서 개인키를 알아낼 수 없다. K=k*G라는 식에서 k는 개인키, G는 생성 포인트라는 상수이며 K는 계산 결과로 나온 공개키다.

 

이산로그 문제를 기반으로 하는 타원곡선 암호학은 비대칭 형식이거나 공개키 암호 형식으로 타원곡선을 구성하는 여러 점 위에서 덧셈 함수나 곱셈 함수로 표현된다.

 

비트코인에서는 secp256k1이라는 표준에서 정의된 특정한 타원 곡선과 여러 수학 상수를 함께 사용한다. 이 곡선은 무작위로 생성된 개인키 k를 출발점으로 하여 미리 정해진 생성 포인트 G를 곱하여 곡선 위의 다른 지점에 해당하는 공개키 K를 얻는다. 이 생성 포인트는 secp256k1의 일부로 지정되어 있으며 비트코인에서 사용하는 모든 키는 이 포인트에 대해 같은 값을 가지기 때문에 개인키 k에 G를 곱하면 항상 같은 공개키 K값이 생성된다. 이러한 k와 K값의 관계는 고정되어 있지만, k 값에서 K값 쪽으로만 한 방향으로 계산할 수 있다. 이것은 개인키를 공개키로 전환할 수 있지만, 공개키를 개인키로 전환할 수 없다는 의미다. 이것이 개인키를 관리해야 하는 이유이다.

 

4. 주소 생성

주소는 암호화폐의 수령인 자격으로 비트코인의 경우 숫자와 문자로 구성된 문자열로 누구에게나 공유할 수 있다. 공개키로부터 생성된 주소는 ‘1’로 시작되고 멀티시그(MultiSig)로 생성된 주소는 ‘3’으로 시작한다. 다음은 멀티시그로 생성된 비트코인 주소의 예시다.

 

3GzhxPosDMJ3AJsaBoKuKBSYFh143Pi8uR

 

주소를 공개키로부터 생성할 때 일방 암호화 기술인 해시함수를 사용한다. 비트코인에서 사용하는 해시함수는 SHA(Secure Hash Algorithm)과 RIPEMD(RACE Integrity Primitives Evaluation Message Digest)이다. 공개키 K를 가지고 SHA256 해시함수를 이용해서 해시값을 산출한 후 산출된 값을 다시 RIPEMD160 해시함수를 이용해 해시값을 산출하면 160비트(20바이트) 크기의 숫자가 생성된다. 즉 다음 A=RIPEMD160(SHA256(K)) 같이 공개키 K를 이용해 해시함수를 이용해 계산한 결과가 주소 A이다.

 

비트코인 주소는 대부분 Base58Check로 인코딩된다. Base58Check 인코딩(Encoding)은 58개의 문자와 검사합(CheckSum)을 이용해서 사람이 읽을 수 있는 문자로 바꾸어 주고 비슷한 모양의 문자를 쓰지 않음으로써 혼란을 방지하고 거래의 표기나 항목에 대한 에러가 발생하지 않도록 한다. <그림 1-3>에서는 공개키를 비트코인 주소로 전환하는 과정을 도식화 한 것이다.

 

<그림 1-3> 비트코인 주소 생성 과정

 

이더리움의 경우 난수생성기에서 생성된 64개의 헥사 값을 그대로 사용하여 개인키로 사용하고 공개키는 ECDSA((Elliptic Curve Digital Signature Algorithm)의 타원 곡선 함수를 이용하며 주소의 경우 Keccak 함수를 이용하여 생성한다. 이와 같이 암호화폐마다 다른 방법으로 개인키, 공개키, 주소를 생성하게 된다.

반응형

댓글