SW/블록체인

블록체인 : 암호키와 비트코인 주소 개념 및 이해 : 암호화폐 지갑 개념, 종류

얇은생각 2022. 1. 26. 07:30
반응형

암호키와 비트코인 주소의 관계

모든 비트코인 거래에는 블록 상의 장부에 기록되기 위해 유효한 서명이 필요합니다. 이러한 서명은 디지털 키가 있어야 생성되는데, 이러한 디지털 키의 복사본만 가지고 있으면 해당 계좌에서 비트코인을 관리할 수 있습니다. 이 디지털 키는 개인 키(private key)와 공개키(public key)로 구성되어 있습니다. 공개키는 은행의 계좌번호와 유사하고, 개인 키는 비밀 번호(PIN 넘버)또는 계좌를 관리하기 위해 수표에 하는 서명과 유사합니다.

비트코인 네트워크상에서, 공개키는 비트코인을 전송받을 때 사용되며, 개인 키는 전송받은 비트코인을 소비(spend)하기 위해 거래에 서명할 때 사용됩니다. 개인 키를 이용해 직접 거래를 발생시킬 수 있으므로 개인 키는 백업을 해야 하고 항상 소중히 보관해야 합니다. 이 디지털 키는 비트코인 지갑 소프트웨어를 이용해 관리 할 수 있습니다.

비트코인에 접근하는 권한을 주는 한 쌍의 키를 생성하기 위해 공개키 암호법을 사용합니다. 이 과정에서 사용하는 암호함수들은 불가역성(Irreversibility)을 가지기 때문에 역방향으로 계산하는 것이 거의 불가능합니다. 개인 키는 주로 무작위 숫자 추출을 통해 생성되는데, 이렇게 생성된 개인 키로부터 타원곡선 암호법을 이용해 공개키를 생성하게 됩니다.

비트코인의 거래에 있어서 비트코인을 수령하는 대상을 의미하는 것이 바로 비트코인 주소입니다. 대부분의 경우 비트코인 주소는 공개키로부터 생성되며 공개키에 대응됩니다. 따라서 디지털 키와 비트코인 주소의 관계는 다음처럼 표현할 수 있습니다. 개인 키로부터 공개키를 생성하고, 공개키를 이용해서 비트코인 주소를 생성합니다. 비트코인 거래에 사용되는 코인의 소유권을 증명하게 되면 비트코인을 소비할 수 있게 되는데, 이때 서명을 위해 개인 키를 사용합니다.

개인 키는 숫자로 구성되어 있으며 대개 무작위로 숫자를 추출하여 생성합니다. 다시 말해, 1에서 2^256 사이의 숫자를 무작위로 선택하는 것입니다. 이때, 선택한 숫자가 재현 가능하지 않도록 보안이 철저한 엔트로피, 즉, 무작위성을 찾아야 하는데, 비트코인 소프트웨어에서는 난수 생성기를 이용해 256bit의 엔트로피를 만들어냅니다. 이때, 암호학적으로 안전한 난수를 생성하기 위해 프로그래밍 언어가 제공하는 단순한 난수 생성기를 사용하기보단 충분한 엔트로피를 가지고 있는 난수 생성기를 사용하는 것이 좋습니다.

이렇게 생성된 난수를 Base58Check를 통해 인코딩하면 지갑에서 볼 수 있는 형태의 개인 키를 생성할 수 있습니다. Base58은 텍스트에 기반을 둔 2진법 인코딩 포맷으로 비트코인이나 기타 여러 암호화폐에서 사용하기 위해 개발되었습니다. Base 64의 부분집합으로, 대문자, 소문자, 숫자 등을 사용하지만 자주 실수가 발생하거나 특정 글자체에서 동일하게 보일 가능성이 있는 몇몇 문자들을 제외한 58개의 문자를 이용하는 방식입니다.

Base58check의 checksum은 중복 검사를 위한 4바이트 크기의 필드입니다. 이 값은 인코딩 되고 있는 데이터의 끝부분에 추가됩니다. 이것을 이용하면 지갑 소프트웨어가 잘못 입력된 비트코인 주소를 유효한 도착지로 승인하는 것을 방지해줍니다. 비트코인에서 사용자들에게 제공되는 데이터는 간결하고 읽기 쉬우며 에러를 쉽게 발견해주는 Base58check로 인코딩됩니다.

 

 

공개키

공개키(Public Key)는 타원 곡선 암호법을 기반으로 하여 개인 키로부터 생성됩니다. 영어로는Elliptic curve cryptography라고 합니다.

 

블록체인 : 암호키와 비트코인 주소 개념 및 이해 : 암호화폐 지갑 개념, 종류 1

 

무작위로 생성된 숫자인 개인 키를 출발점으로 해서, 곡선 위에서 미리 정해진 값인 생성 포인트 G를 곱해 곡선상의 다른 곳에 위치한 포인트를 얻음으로써 공개키를 생성할 수 있습니다. 생성 포인트는 모든 비트코인 사용자들마다 항상 동일하기 때문에 개인 키 k에 G를 곱하게 되면 항상 동일한 값의 공개키 K를 얻을 수 있습니다.

그림은 간단한 형태의 타원곡선을 보여줍니다. 이때, 공개키 K의 포인트를 K=(x, y)로 정의할 수 있습니다. G를 곡선에 대입한 후, 해당 포인트에 대한 접선을 그려서 곡선과의 교차점을 찾고, x축에 대칭시킵니다. 이 과정을 반복하여 생성 포인트 G에 대해 여러 개의 k*G를 찾는 것이 목표라고 할 수 있습니다. 이 역시 불가역성을 가지고 있기 때문에 공개키를 이용해 개인 키로 전환하는 것은 불가능합니다.

 

 

 

공개키로 비트코인 주소 생성

비트코인 주소는 나에게 코인을 전송하고자 하는 어떤 노드와도 공유할 수 있습니다. 공개키로부터 생성된 비트코인 주소는 숫자와 글자의 조합으로 이루어져 있고, 숫자 1로 시작합니다. 공개키를 표현하는 수단이자, 공개키에서 생성된 결과물인 비트코인 주소를 생성하는 과정에 대해 아래 플로우 차트를 통해 설명을 드리겠습니다. 비트코인 주소를 공개키로부터 생성하기 위해 일방 암호화 해싱을 이용합니다.

 

블록체인 : 암호키와 비트코인 주소 개념 및 이해 : 암호화폐 지갑 개념, 종류 2

 

해시 알고리즘은 임의의 크기의 입력값으로부터 해시값을 생성해내는데, 역방향으로 해시값으로부터 원본 입력값을 알아내는 것은 불가능하다는 특징을 가지고 있습니다. 공개키로부터 비트코인 주소를 만드는 데 사용되는 알고리즘은 보안 해시 알고리즘(SHA)과 RIPEMD입니다. 공개키 K를 가지고 SHA256 함수를 이용해 해싱하면, 256bit 크기의 해시값을 얻을 수 있는데요, 이 값을 다시 RIPEMD160으로 해싱하면 160bit 크기의 숫자가 생성됩니다.

여기서 중요하게 기억하셔야 할 것은, 비트코인 주소는 공개키와 똑같지 않다는 점입니다. 비트코인 주소도 개인 키에 적용한 것과 마찬가지로 Base58check 인코딩을 통해 사용자가 읽을 수 있는 형태로 전환되어 제공됩니다. 생성된 디지털 키는 실제로 네트워크상에 저장되어 있지 않고 지갑이라고 하는 파일에 저장됩니다.

사용자의 지갑 속에 들어 있는 디지털 키는 비트코인 프로토콜과 완전히 독립되어 있고, 인터넷 접근 없이 사용자의 지갑 소프트웨어가 생성하고 관리할 수 있습니다. 대부분의 지갑 구현에서는 개인 키와 공개키가 편의를 위해 한 쌍의 키 형태로 함께 저장됩니다. 하지만 공개키는 개인 키를 기반으로 계산할 수 있기 때문에 개인 키만 저장하는 것도 가능합니다.

 

 

 

지갑

지갑은 기본적으로 5가지 기능을 가지고 있습니다. 첫 번째, 개인 키 (Private key)를 생성할 수 있습니다. 결정적 키 생성법을 이용하면 이전 개인 키로부터 새로운 개인 키를 생성할 수 있고, 개인 키들은 차례로 연결됩니다. 두 번째, 개인 키로부터 공개키(Public key)를 생성할 수 있습니다. 세 번째, 공개키로 주소를 만들 수 있습니다. 지갑은 여러 개의 주소를 생성하고 관리할 수 있습니다. 네 번째, 거래를 승인함으로써 코인을 전송할 수 있습니다. 이는 개인 키로부터 만들어진 특별한 서명으로 거래의 진위를 판별함으로써 이루어집니다. 다섯 번째, 여기서 생겨난 정보를 블록체인 네트워크에 공유, 또는 전파합니다.

 

 

 

비트코인의 유형

비트코인 지갑은 비트코인이 아닌 키를 가지고 있고, 각 사용자들은 키가 들어있는 지갑을 보유하고 있습니다. 키를 생성하는 다양한 방법에 따른 지갑의 구조에 대해서 살펴보겠습니다. 첫 비트코인 클라이언트에서 지갑은 단순히 무작위로 생성된 개인 키를 모아 놓은 장소였습니다.

이러한 유형을 유형-0 비결정적 지갑이라고 하고, ‘키만 한가득’이라는 별명으로 불리기도 합니다. 비결정적 지갑은 관리하거나 백업, 데이터를 불러오기에 복잡한 구조를 가지고 있습니다. 또한 무작위로 뽑힌 키는 한 번 생성된 후, 전부 복사본을 보관해야 한다는 번거로움도 있습니다.

이는 지갑이 자주 백업되어야 함을 의미합니다. 만약 키를 백업하지 않아, 지갑에 접근할 수 없게 되면 키가 관리하는 돈을 모두 잃게 됩니다. 이러한 특징 때문에, 지갑의 유형이 점점 결정적 지갑으로 바뀌는 추세입니다. 결정적 지갑(Deterministic wallet)에는 일방 해시 함수를 이용해 공통 종자에서 얻은 개인 키들이 담겨있습니다.

종자만 있으면 추출키 전부를 복원할 수 있기 때문에 특정 시기에 한 번만 백업하면 됩니다. 또한 import와 export도 종자만 있으면 가능하기 때문에 다른 종류의 지갑 사이에서도 사용자들의 키 전부가 쉽게 이동할 수 있다는 장점이 있습니다. 결정적 지갑 중 가장 발달된 유형이 바로 계층 결정적 지갑입니다.

계층 결정적 지갑에서는 트리 구조에서 생성된 키를 담고 있습니다. 이 구조에서는 부모 키가 자식 키를 생성하고, 자식 키가 손자 키를 만들어 낼 수 있습니다. HD 지갑(Hierarchical Deterministic wallet)은 비결정적 키에 대해 두 가지 주요한 장점을 제공합니다.

첫 번째로는, 수입금을 받기 위한 서브키로 구성된 특정 브랜치가 언제 사용되는지 등 유기적인 구조의 의미를 표현하기 위해 트리 구조가 사용될 수 있다는 점입니다. 키의 브랜치는 각기 다른 브랜치를 각 부서, 자회사 등에 배당함으로써 회사 내의 설정에서 사용될 수 있습니다.

두 번째, 사용자들이 공개키에 대응하는 개인 키에 접근하지 않고도 공개키를 생성할 수 있습니다. 따라서 안전하지 않은 서버나 수신 기능만을 하는 서버에서도 HD 지갑을 사용할 수 있고 각각의 거래에 대해 다른 공개키를 발급하게 됩니다.

 

블록체인 : 암호키와 비트코인 주소 개념 및 이해 : 암호화폐 지갑 개념, 종류 3

 

암호화폐 지갑은 개인키 및 공개키를 저장하고 다양한 블록과 상호 작용하여 사용자가 암호화폐를 보내고 받을 수 있도록 하는 소프트웨어입니다. 전통적인 '포켓' 지갑과 달리 디지털 지갑은 화폐를 저장하지 않습니다. 실제로 화폐는 단일 위치에 저장되거나 물리적인 형태로 존재하지 않고, 존재하는 것은 모두 블록체인에 저장된 트랜잭션 레코드 뿐입니다.

암호화폐 지갑은 소프트웨어, 하드웨어 및 종이의 세 가지 카테고리로 분류할 수 있습니다. 소프트웨어 지갑은 데스크톱, 모바일 또는 온라인이 될 수 있습니다. 하드웨어 지갑은 USB와 같은 하드웨어 장치에 사용자의 개인 키를 저장한다는 점에서 소프트웨어 지갑과 다릅니다. 하드웨어 지갑은 트랜잭션을 온라인으로 만들지만, 오프라인으로 저장되므로 보안이 훨씬 더 강화됩니다.

종이 지갑은 사용하기 쉽고 매우 높은 수준의 보안을 제공합니다. 종이 지갑이라는 용어는 단순히 공개키 및 개인 키의 실제 사본 또는 인쇄물을 나타낼 수 있지만, 인쇄된 키 쌍을 안전하게 생성하는 데 사용되는 소프트웨어를 나타낼 수도 있습니다.

 

 

참조

http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about 

 

블록체인 입문

블록체인과 암호화폐 기술을 깊이 배우기에 앞서, 비 전공자들도 이해를 할 수 있는 수준으로 블록체인과 암화화폐에 대한 high-level 설명 및 응용 예시를 제공하고 실제 상황에 적용할 수 있다.

www.kmooc.kr

반응형