지능이라는 이름의 게임(15): 집단지능과 블록체인(7)

블록체인에 있어 해시함수에 버금갈 정도로 중요한 요소기술은 공개키 암호화(public key encryption)이다. 공개키로는 원장에 있는 거래 참가자의 이름을 가명화(pseudomization)하여 개인정보를 보호할 수 있으며, 개인키(private key)로는 송금액과 송신자의 신원을 묶어서 전자서명(digital signiture)을 하여 거래 참가자(송금자)의 신원을 확인하고 원장의 위조와 변조를 예방할 수 있다.

암호화(encryption)란, 누구나 내용을 알 수 있는 평문(plaintext)을 제3자가 알아볼 수 없는 글자, 숫자, 부호의 조합인 암호문(cypertext)으로 바꾸는 작업이다. 암호화에 필수적으로 필요한 도구가 암호키(encryption key)이다. 암호문은 글자, 숫자, 부호 등이 마구 뒤섞여 있는 것처럼 보이지만 사실 그 안에는 규칙이 숨어있다. 암호키란 그 규칙을 생성하는 값이다(아래 그림 참조).

관련 이미지

암호화에는 두 가지 방식이 있다. 하나는, 평문을 암호문으로 변환할(암호화) 때와 암호문을 평문으로 변환할(복호화) 때 동일한 암호키–그것을 비밀키(secrete key)라고 부름–를 사용하는 대칭키(symetric key) 방식이고, 다른 하나는, 한 쌍의 암호키를 생성하여 한 키–수신자의 공개키(public key)–는 암호화에 사용하고, 다른 키–수신자의 개인키(private key)–는 복호화에 사용하는 공개키(public key)(비대칭키, asymetric key라고도 부름) 방식이다.

참고로 해시함수도, 메시지를 제3자가 알아볼 수 없는 숫자와 문자의 조합으로 바꾼다는 의미에서 암호화의 일종이지만, 거기에는 별도의 암호키가 사용되지 않는다. 때문에 누가 해시함수를 수행해도 동일한 메시지(입력값)을 가지고 동일한 알고리즘을 적용하면 동일한 해시(산출값)를 얻는다.

블록체인에서는 공개키 방식의 암호화가 사용된다. 다만 암호화 대신에 전자서명(digital signiture)이 채택된다. 암호화와 전자서명은 동일한 알고리즘을 적용하지만 용도가 다르기 때문에 공개키와 개인키를 다르게 사용한다.

암호화은 주로 메시지를 안전하게 보내는 데 사용된다. 따라서 수신자의 공개키(public key)를 사용하여 메시지를 암호화하여 보내면 수신자가 자신이 가지고 있는 개인키(private key)로 복호화하여 전달된 메시지를 읽는다(아래 그림 참조).

encryption에 대한 이미지 검색결과

반면에 전자서명은 주로 신원확인과 위변조 방지에 사용된다. 먼저 데이터를 해싱하여 해시를 얻은 다음 그 해시를 서명자의 개인키를 사용하여 암호화하면 전자서명된 데이터가 된다. 검증자는 인터넷을 통해서 그 데이터에 접근하여, 서명자의 공개키(그것은 공개되어 있음)를 사용하여 복호화하여 얻은 해시와 원 데이터의 해시를 비교하여 서명자의 신원과 데이터의 무결성(integrity)을 확인할 수 있다(아래 그림 참조).

digital signature에 대한 이미지 검색결과

블록체인에서는 아래 그림처럼 먼저 공개키(public key)와 개인키(private key)의 쌍이 생성된다. (주석 1)

그 다음에 생성된 개인키(private key)를 이용하여 메시지 20.00($)에 대해 서명(sign)을 한다(아래 그림 참조).

그러면 아래 그림에서처럼 전자서명(signiture)이 생성된다. 이 과정을 좀 더 공식적으로,

Sign(hashed message, Private Key) = Signiture

라고 표현할 수 있을 것이다. 이 사례에서 메시지는 20.00이다. 만약 20.00에 조금이라도 변경이 가해지면 설령 송금자자신이 그렇게 했더라도 바로 전자서명의 해시가 완전히 달라져 버린다. 그리고 이 전자서명은 일반적인 서명과 달리 복사해서 다른 곳에 사용할 수 없다. 그 안에 특정한 메시지(여기서는 20.00)가 포함되어 있기 때문이다.

검증자(이체의 수신자)는 메시지(20.00)가 송금자가 기재한 대로인지에 대해 공개키(public key)를 이용하여 검증(verify)할 수 있다. 공식으로 표현하면 아래와 같다.

Verify(hashed message, signiture, public key) = True/False

위 그림에 보면 From란에 송금자의 이름 대신 송금자의 공개키가 들어가 있다. 그렇게 가명화함으로써 누가 송금한 것인지를 알 수 없게 하고 있다. 즉, 송금자의 개인정보가 보호되는 것이다.

블록이 채굴된 후(즉, 검증된 후) 송금자 이외의 사람이 송금액수를 변조하면 전자서명에 오류가 발생하여 그것을 바로 알 수 있다. 전자서명은, 서명할 때의 송금액, 서명할 때 사용된 송금자의 개인키라는 두 가지 입력값에 조금도 변화가 없을 때–이러한 상태를 무결성(integrity)이라고 한다–만이 오류가 없는 상태로 유지된다. (윤영민, 2018-05-14)

(주석 1) 직접 암호키를 생성해 보고 싶은 독자는 Putty라는 공개 소프트웨어를 사용하면 아래 그림과 같이 공개키와 개인키의 쌍을 생성할 수 있다[puttygen.exe (a RSA and DSA key generation utility)이라는 유틸리티를 다운로드 받을 것].

위 그림에서 Generate라는 단추를 누르면 암호키가 생성된다. 단, 그냥 기다리면 안되고 파랗게 된 부분(박스)에 커서를 대고 움직여 줘야 한다. 그러면 잠깐 동안에 암호키기 생성될 것이다. 파랗게 하일라이트된 부분이 필자가 생성한 공개키이다. 그리고 그 아래에 보면 그 공개키의 해시(key fingerprint)가 나와 있다. 여기에 적용된 알고리즘은 RSA인데, 원하면 다른 알고리즘을 선택할 수 있다(Parameters 부분을 이용). 나중에 저장된 암호키를 사용하려면 Key passphrase 박스를 이용해서 비밀번호를 만들어 둬야 한다. 그래야 자신만이 개인키를 볼 수 있을 것이다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.