비트코인과 공개키 암호화 Tech Info

비트코인은 공개키 암호화를 이용한 전자서명을 사용한다. 비트코인 뿐만 아니라 거의 모든 블록체인 시스템이 마찬가지이고 이때문에 암호화폐라는 이름으로 불리고 있기도 하다. 공개키 암호화는 암호화폐 외에도 웹브라우저의 https 암호화나 우리나라의 공인인증서에서도 사용되는 방식이고 아이폰에서 개발자가 앱을 등록할때 사용되기도 한다. 공개키 암호화의 세부적인 알고리즘은 나 같은 일반 개발자가 이해하기에 무리가 있다. 여기서는 이걸 어떻게 활용하고 있는지만 대략적으로 훑어보자.

공개키 암호화에서는 2가지 종류의 키를 사용한다. 하나가 공개키고 다른 하나가 비밀키다. 공개키로 데이타를 암호화하면 비밀키로만 복호화할 수 있다. 비밀키로는 데이타를 암호화하지 않는다. 공개키는 일반적으로 널리 알려진 키로 사용되니까 비밀키로 암호화해서 공개키로 복호화하는 짓은 할 이유가 없을 것이다. 대신에 비밀키로는 데이타를 서명할 수 있고, 공개키를 이용해 이 서명을 검증할 수 있다. 이게 우리가 흔히 이야기하는 전자서명이다. 비트코인에서는 전자서명만 활용하고 암호화는 사용하지 않는다.

공개키 암호화 알고리즘도 여러 종류가 있는데 가장 먼저 사용된 방식중 하나인 RSA는 큰 정수의 인수분해가 어렵다는 원리를 이용한 것이란다. A * B = C 의 식에서 A와 B가 아주 큰 소수(prime) 이면 C를 안다고 해도 C가 A와 B의 곱으로 구성된다는걸 찾는건 어렵고, C를 공개키, (A,B)를 비밀키로 사용하면 C를 가지고 있어도 A,B가 뭔지는 알수 없고, 반면에 A,B를 가지고 있으면 C는 금방 계산할수 있다. 실제로는 C와 A,B가 아니라 이걸 좀더 변형한 값들을 공개키와 비밀키로 사용하는데 그건 이해가 안되니 생략하자. 그리고 A,B를 이용해 생성한 서명을 C로 어떻게 검증할 수 있는지도 생략하자. A,B를 이용해 생성한 서명이란건 A,B를 이용해 특정 해시알고리즘으로 데이타를 해시한 값을 의미하고, C로는 이 해시값을 만들지 못하지만 이 해시값이 C를 인수분해하는 두 숫자로 만든 해시값이라는건 검증할 수 있다는 정도만 알고 넘어가자.

비트코인에서 사용하는 공개키 암호화 알고리즘, 혹은 전자서명 알고리즘은 ECDSA다. 타원곡선 위의 특정한 좌표를 이용해 비밀키와 공개키 쌍을 생성하는 것이라 하는데 이것도 굳이 알 필요는 없을것 같다. 비트코인은 최근에, 아니 몇 년전부터 준비를 해서 서명 알고리즘을 schnorr 알고리즘으로 변경하려 하고 있다. 역시 자세한 내용은 알 필요가 없지만 왜 바꾸려하는지는 참고하면 좋을 것 같다.

이제, 전자 서명이 어디에 사용되는지 살펴보자. 비트코인의 블록체인에 저장되는 정보는 얼마의 돈을 어디에서 어디로 옮긴다는 거래정보 뿐이다. 예를들면, "500 BTC를 A에서 B로 옮긴다" 정도의 정보다. 사용자 B 혹은 B의 소유권이 있는 사람이 이걸 C로 옮기고 싶으면 "500 BTC를 B에서 C로 옮긴다"는 거래를 생성해서 broadcast 한다. 그런데 이 사용자가 B 인지, 혹은 B의 소유권이 있는건지 확인할 방법이 필요하다. 1차적으로 여기에 전자서명이 사용된다. "500 BTC를 A에서 B로 옮긴다"는 거래에는 B의 공개키가 포함되어 있다. B에서 다른 곳으로 옮기려면 B의 비밀키를 이용한 서명을 제시해야 한다. 이를 위해 B의 소유자는 "500 BTC를 B에서 C로 옮긴다"는 거래내역 자체를 B의 비밀키로 서명한다. "500 BTC를 B에서 C로 옮긴다"는 거래내역과 그 서명을 전달받은 Node들은 B의 공개키와 서명이 있으니 이 거래가 B에 의해 만들어졌다는 것을 검증할 수 있다. 또 한가지, 이 서명을 통해 "500 BTC를 B에서 C로 옮긴다"는 거래내역이 변조되지 않았다는 것 역시 검증이 가능하다. 이와같은 소유권 확인과 데이타 변조방지 2가지 효과는 전자서명의 기본 동작원리이기도 하고 우리가 사용하는 공인인증서의 활용방식과도 동일하다.

공개키 암호화 알고리즘의 특징 중 하나는 누구든, 아무때나, 아무런 조건없이 키 쌍을 생성할 수 있다는 것이다. 비밀키는 일종의 랜덤 넘버와 같다. 랜덤 넘버를 하나 만들어서 나 혼자만 가지고 있는 것이다. UUID를 생각해보면 다른 누군가가 생성한 값과 겹치지 않는 유니크한 값을 생성하는 것이 어렵지 않다는 것을 알수 있을 것이다. 어쨌거나 이 특성 덕분에 누군가가 로그인 계정이나 계좌번호 같은걸 발급해줄 필요가 없다. 아무나 필요한 만큼 랜덤 넘버를 생성해서 사용할 수 있고 이게 곧 계좌번호처럼 사용된다. 이 덕분에 비트코인과 같은 중앙서버가 없이 완전히 분산된 P2P 전자화폐가 가능한 것이기도 하다. 계좌번호를 당신이 임의로 만들 수 있다. 그럼 다른 사람은 그 계좌번호로 돈을 보낼 수 있다. 그 계좌번호는 당신이 만든 공개키이므로 비밀키로 만든 서명을 보여주면 누구든 당신이 주인이라는걸 확인할 수 있다. 이제 이 계좌의 돈을 일부는 다른 사람이 생성한 계좌로, 일부는 당신이 생성한 또 다른 계좌로 보낼 수 있다. 이게 비트코인이 동작하는 기본 원리다.

그런데 이 비밀키, 내가 생성한 랜덤 넘버. 한 개도 아니고 수시 때때로 만들어댄 이 숫자들을 어떻게 관리할 것인가 하는 문제가 있다. 이 비밀키를 누군가 훔쳐가면 내 돈을 훔쳐간 셈이 되고, 이 비밀키를 잃어버리면 내 돈을 잃어버린 셈이 된다. 어떻게 보면 이건 현금도 비슷하긴 하다. 현금을 가지고 다니다가 도난 당할 수도 있고 어딘가에 지갑을 잃어버릴 수도 있다. 그래서 대부분의 돈은 은행에 맡겨두고 일부만 인출해서 지갑에 넣고 다닌다. 은행의 돈은 휴대폰을 이용해 다른 계좌로 이체하고 이때 공인인증서와 OTP, 문자 인증으로 2중, 3중으로 확인한다. 물론 은행에 돈을 보관하는 것과 비트코인의 비밀키들을 보관하는 것엔 차이가 있기도 한데 이건 다음 기회에 다뤄보기로 하겠다.

1 2 3 4 5 6 7 8 9 10 다음



통계정보