디지털 서명
비트코인에서는 비대칭키 암호화를 이용해 디지털 서명을 남긴다.
비대칭키는 공개키와 비밀키라는 2가지 키를 사용한다.
이 두가지 키는 랜넘 넘버로부터 만들 수 있다. (우리는 암호학을 공부하는 게 아니므로 구체적인 방법은 넘어가자)
이때 비대칭키 암호화 방식은 지난 글에서도 정리한 적 있듯이, 두 가지 용도로 사용될 수 있다.
첫 번째는 공개키로 메세지를 암호화 한 뒤, 비밀키로 이를 해독하는 것이다.
만약 앨리스가 밥에게 밥만 알아볼 수 있는 내용으로 암호문을 보내고자 한다면, 밥이 제공하는 공개키로 메세지를 암호화해서 밥에게 보내면 된다. 그 메세지는 밥이 가진 비밀키로만 해독할 수 있기 때문이다.
두 번째는 비밀키로 데이터에 서명을 남긴 뒤, 공개키로 이를 검증하는 것이다.
비트코인에서는 이 용도로 비대칭키 암호화를 활용한다.
서명을 할 때는 우리가 문서에 서명을 하듯이, 서명 대상(메세지)이 필요하며, 서명 대상에 비밀키를 이용하여 서명을 생성한다.
검증은 퍼블릭키와 원본 서명 대상이 있으면 그 원본 대상에 대해 서명이 올바른지 검증할 수 있다.
이 그림을 보면 센더는 메세지를 보낼 때 센더의 비밀키로 서명을 만들어서 원본 메세지와 서명을 같이 보낸다.
(암호화와 달리 원본 메세지도 같이 보낸다! 또 암호화에서는 비밀키가 아닌 퍼블릭키로 암호화를 했었다.)
그리고 수신자가 혹시 센더의 공개키를 갖고 있지 않을 수도 있으므로 공개키도 같이 보낸다.
이것이 과거 우리나라에서 사용했던 '공인인증서' 이다. 인증서에 법적인 지위를 부여해서 공인인증서라고 불렀다. 지금은 공동인증서로 바뀌었다. 공인인증서에는 누구에게 퍼블릭키 무엇을 부여했다는 정보가 대부분이다.
이때 누구에게 이 퍼블릭키를 부여했다는 정보만 있다면, 악의적인 사용자가 자신의 퍼블릭 키를 넣고 기존 사람의 이름(홍길동)을 넣어서 조작할 수 있다. 그러면 상대방은 자신이 수신한 퍼블릭 키를 가지고 공격자의 서명을 검증한 뒤, 검증에 성공하면 홍길동이 이 서명을 했다고 인식할 수 있다. 따라서 이 공개키가 조작되지 않았다는 것을 확인하는 절차가 필요하고, CA (Certificate Authority) 라는 인증서 발급 기관이 공개키가 조작되지 않았다는 것을 검증하여 서명한다. 이때 CA의 서명한 것을 검증하기 위해서는 CA의 공개키가 필요한데, CA는 말 그대로 공공기관 급의 인증기관이므로 얼마든지 정확한 공개키를 사용해서 검증할 수 있다.
이 과정은 보통 웹 브라우저가 대신 수행한다.
결국, CA의 퍼블릭키로 CA의 서명을 검증하면, 지금 이 인증서에 있는 공개키가 홍길동의 공개키가 맞다는 것을 알 수 있으므로 그 공개키를 이용해서 서명을 검증했을 때 이 서명이 홍길동의 서명이라는 것을 확신할 수 있게 된다.
이 그림에서 나온 Senders X.509 는 인증서 표준 포맷을 말한다.
그리고 이 그림은 해시를 쓰지 않고 서명을 하는 모습을 나타내는데, 대부분의 경우 해시를 한 후에 서명을 한다.
(해싱을 하면 원본 데이터의 크기가 작아져서 서명하는데 시간이 더 적게 걸려 효율적이다.)
이 그림은 해싱을 한 후에 서명을 하는 모습을 나타낸다.
원래 데이터에 SHA 256 같은 해싱 알고리즘을 적용해서 해싱을 하고, 이 결과에 비밀키를 이용해서 서명을 만든다.
수신자에게는 원본 데이터와 서명을 같이 보내면, 수신자는 같은 해싱 알고리즘으로 기존 데이터가 위조되지 않았다는 것을 검증하고, 서명을 공개키로 검증하여 이 데이터를 보낸 사람이 정말 그 공개키의 주인인 사람이 맞다는 것을 확인할 수 있다.
(비밀키를 이용한 서명은 해싱 데이터를 서명으로 암호화 한 것, 공개키를 이용한 검증은 암호화된 서명을 원래 해시값으로 복호화하는 것과 같다. 복호화하면 최초 해싱 결과가 나오므로, 원본 데이터를 해싱한 값과 비교해서 무결성과 서명 검증을 동시에 할 수 있다.)
=> 즉, 비밀키로 암호화한 것을 공개키로 해독할 수 있고, 공개키로 암호화한 것을 비밀키로 해독할 수 있다.
전자는 '서명' 이라는 이름의 용도로 사용되는 것이고 (누구나 해독할 수 있으므로 암호화 용도로는 의미가 없다.)
후자는 '암호화' 용도로 사용되는 것이다. (누구나 암호화할 수 있고, 해독은 나만 가능하다.)
이때 비대칭 키 시스템은 재미있는 특성이 있는데, 바로 비밀키로부터 퍼블릭키는 유도할 수 있지만, 퍼블릭 키로부터는 비밀키를 유도할 수 없다는 것이다.
따라서 홍길동이라는 사람이 자신의 비밀키로 서명을 했을 때, 이순신이라는 홍길동의 퍼블릭 키로는 홍길동의 비밀키를 알아낼 수 없다.
(수학자들이 할 수 없음을 밝혔다.)
만약 퍼블릭 키로 비밀키를 알아낼 수 있다면, 이순신이라는 사람은 홍길동의 비밀키를 알아내서 그 비밀키로 여기저기 서명을 하면서 홍길동인 척 할 수 있을 것이다.
비트코인은 서명에 EDCSA (Elliptic Curve Digital Signature Algorithm) 라는 타원곡선 기반의 디지털 서명 알고리즘을 사용한다.
(타원 곡선은 y² = x³ + 7 과 같은 형태의 수식을 갖는 곡선이다.)
비트코인 주소 (Bitcoin Address)
비트코인 주소는 비트코인을 거래할 때 사용하는 일종의 계좌번호와 같다.
따라서 비트코인 주소를 사용해서 하나의 주소에서 다른 주소로 비트코인을 전송할 수 있다.
비트코인의 주소는 wallet(지갑) 소프트웨어를 가지고 만들 수 있다. (다른 블록체인 프로젝트도 똑같다.)
지갑 소프트웨어는 랜덤 넘버로부터 원하는 만큼 프라이빗 키를 여러개 생성할 수 있다.
실제 은행 계좌와 다르게 비트코인 주소는 생성하는 것이 쉽기 때문에, 하나의 주소를 여러번 반복해서 사용할 이유가 없고, 매번 새로운 주소를 만들어서 사용할 수 있으며, 오히려 그렇게 하는게 프라이버시 측면에서도 유리하다.
비트코인의 주소와 이 주소의 트랜잭션을 연결시키기 더 어렵게 만들기 때문이다.
지갑 소프트웨어는 위에서 상술한 대로 프라이빗 키만을 보관하고 있으며, 프라이빗 키를 가지고 퍼블릭 키를 생성한다.
생성된 퍼블릭 키는 그 자체로 주소로 사용하지 않고, 퍼블릭 키를 여러번 해싱해서 주소로 사용한다.
이 이미지는 프라이빗 키로부터 퍼블릭키를 생성하고, 생성된 퍼블릭 키로부터 비트코인 주소를 만드는 과정을 보여준다.
비트코인 주소를 만들 때는 위에서 보이는 것처럼, 퍼블릭키를 SHA 256 과 RIPEMD-160 알고리즘을 사용해서 두 번 해싱한다.
그러면 그 결과로는 160bit (= 20byte) 의 해시값이 생성되는데, 이 결과에 SHA256 으로 두 번 해싱한 값의 일부를 체크섬으로 뒤에 붙여서 Base 58 인코딩 해서 주소로 사용한다.
매우 복잡한데, 다시 정리해보면 다음과 같다.
1. 비밀키로부터 공개키를 만든다.
2. 공개키를 SHA 256으로 해싱한다.
3. 해시값을 RIPEMD-160 으로 해싱한다.
4. 이 해시값을 SHA256으로 두번 해싱하고, 그 결과값의 일부(체크섬 역할)를 3번 결과 뒤에 붙인다.
5. 이 값을 Base 58 로 인코딩한다.
이때 체크섬 역할을 하는 그림의 파란색 부분은, 주소를 입력할 때 내가 지금 주소를 잘못 입력하고 있지는 않는지, 이 주소가 유효한 주소가 맞는지 확인하는 용도로 사용한다.
(3의 결과로 나온 주소가 유효한 주소라면, 이를 두번 해싱한 결과의 일부 체크섬과 일치할 것이다.)
또 Base58은 Base64 보다 6개가 줄어든 인코딩 방식으로, 헷갈리는 문자쌍을 제거한 인코딩 방식이다.
0과 대문자 O, 소문자 l과 대문자 I 가 헷갈리니 제거하고, +, = 과 같은 특수기호 2개도 제거하면 base 58 인코딩 방식이 된다.
이 비트코인 주소값은 내가 외울 필요는 없다.
비트코인 월렛이 프라이빗 키를 알고 있으니 얼마든 이 주소를 만들 수도 있고 관리도 한다.
그래서 누군가 나에게 비트코인을 보내겠다고 한다면, 나는 월렛이 관리하는 주소를 그대로 알려주면 된다.
'CS > 블록체인' 카테고리의 다른 글
[블록체인] 6. Proof-of-Work (Consensus Protocol & Native Currency) (0) | 2024.10.11 |
---|---|
[블록체인] 5. 트랜잭션 포맷 (0) | 2024.10.10 |
[블록체인] 3. 블록체인의 구조와 해시 함수 (0) | 2024.10.09 |
[블록체인] 2. 블록체인의 활용 (0) | 2024.10.09 |
[블록체인] 1. 블록체인 개요 (0) | 2024.09.30 |