공개키와 디지털 서명
비트코인에서는 비밀을 보여 주지 않고도 거래를 만들 권한이 있다는 사실을 증명해야 합니다. 개인키로 거래에 디지털 서명을 만들고, 공개키로 그 서명이 진짜인지 누구나 확인하는 방식이 이 문제를 해결합니다.
비밀번호를 보여 주지 않는 증명
은행에서 돈을 보낼 때는 로그인과 비밀번호, 지문 같은 수단으로 본인 확인을 합니다. 은행이라는 회사가 계좌의 주인을 확인하고 문제가 생겼을 때 판정해 주는 구조입니다.
비트코인에는 이런 판정을 독점하는 회사가 없습니다. 비밀번호를 상대에게 보여 주는 방식도 사용할 수 없습니다. 비밀번호를 본 사람이 같은 내용을 그대로 흉내 낼 수 있기 때문입니다.
필요한 것은 비밀은 감춘 채 권한만 증명하는 도구입니다. 개인키와 공개키, 그리고 디지털 서명이 그 역할을 나누어 맡습니다.
개인키와 공개키
개인키는 사용자만 아는 비밀 숫자입니다. 공개키는 개인키에서 계산으로 만들어지는 짝꿍 열쇠로, 다른 사람에게 보여 주어도 되는 값입니다.
개인키를 이용해 서명을 만들 수 있지만, 공개키를 보고 개인키를 거꾸로 계산할 수는 없습니다. 따라서 거래를 확인하는 사람은 공개키를 사용할 수 있지만, 거래를 서명할 권한의 원천인 개인키를 알 수는 없습니다.
서명은 거래에 찍는 디지털 도장
서명은 개인키로 거래에 찍는 디지털 도장입니다. 종이 도장은 같은 도장을 여러 문서에 찍을 수 있지만, 비트코인의 서명은 서명 방식이 지정한 거래 내용의 범위와 연결되어 있습니다.
서명을 만들 때는 보내려는 거래 내용과 개인키를 함께 계산에 넣습니다. 그 결과 서명이라는 숫자가 나옵니다. 일반적인 송금에서는 금액이나 받는 조건처럼 서명이 보호하는 내용이 달라지면 그 거래에 맞는 서명도 달라집니다.
비트코인 거래 서명에는 서명 해시 유형이 사용되며, 유형에 따라 보호되는 입력과 출력의 범위가 달라질 수 있습니다. 따라서 서명이 거래 전체의 모든 부분을 언제나 고정한다고 일반화할 수는 없습니다. 정확히는 선택된 서명 방식이 지정한 범위의 무결성을 확인합니다. 자세한 서명 범위는 Bitcoin Developer Guide의 거래 설명에서 확인할 수 있습니다.
누구나 검증할 수 있다
거래를 검증하는 사람에게는 세 가지가 주어집니다.
- 무엇을 어디로 얼마를 보낼지 적힌 거래 내용
- 개인키로 만들어 거래에 붙인 서명
- 서명을 확인할 공개키
검증 계산의 결과는 맞거나 틀리거나 둘 중 하나입니다. 결과가 맞다면 다음과 같은 내용을 확인할 수 있습니다.
- 해당 공개키와 짝을 이루는 개인키로 서명되었다는 사실
- 선택된 서명 방식이 보호하도록 지정한 거래 내용의 범위가 서명 이후 바뀌지 않았다는 사실
이는 거래를 구성한 사람의 신원이나 서명자의 현실 세계 신원을 증명하는 것은 아닙니다. 또한 거래의 모든 지출 조건이 충족되었다는 의미도 서명 하나만으로 결정되는 것은 아닙니다. 네트워크는 서명 범위 외에도 거래 형식과 입력의 사용 가능 여부 등 다른 규칙을 함께 확인합니다.
이 검증에는 특정 기관의 자격증이나 승인이 필요하지 않습니다. 네트워크에 참여하는 컴퓨터들은 거래를 받을 때마다 각자 검증 계산을 수행할 수 있습니다. 어느 한 기관의 승인 도장에 의존하는 대신, 여러 참여자가 같은 규칙으로 직접 확인합니다.
서명에서 개인키가 새어 나가지 않는 이유
서명을 네트워크에 공개하면 개인키도 조금씩 노출되는 것 아니냐는 의문이 생길 수 있습니다. 디지털 서명은 개인키와 거래 내용을 이용해 서명을 만들지만, 정상적으로 구현되고 적절한 조건이 지켜진 경우 서명에서 개인키를 거꾸로 계산하는 것은 현실적으로 불가능하도록 설계되어 있습니다.
도장 자국을 본다고 도장 원본을 깎아 낼 수 없는 것과 비슷합니다. 네트워크에 공개되는 것은 거래에 맞춰 만들어진 서명과 공개키이지, 개인키 자체가 아닙니다. 다만 서명 구현의 난수 생성이나 일회성 값 사용에 문제가 있으면 별도의 위험이 생길 수 있습니다.
신뢰 대신 검증
비트코인에서 말하는 ‘신뢰 대신 검증’은 누군가가 이 거래가 진짜라고 말해 주기를 기다리지 않는다는 뜻입니다. 참여자들은 거래 내용, 서명, 공개키를 바탕으로 각자 직접 확인합니다.
서명은 해당 공개키에 대응하는 개인키로 보호 대상 내용에 서명했음을 확인하게 하고, 서명 방식이 지정한 범위의 무결성을 확인하게 합니다. 공개키는 확인에 사용되지만, 그 자체가 사용자의 실명이나 현실 세계의 신원을 증명하는 것은 아닙니다.
정리
- 개인키는 거래에 서명을 만드는 비밀 값입니다.
- 공개키는 개인키에서 계산되며, 서명을 누구나 검증할 수 있게 합니다.
- 서명은 지정된 거래 범위와 연결되어 있어, 그 범위 안의 내용을 임의로 바꾸면 검증에 실패합니다.
- 검증이 통과하면 해당 개인키로 보호 대상 내용에 서명했다는 점을 확인할 수 있지만, 거래 작성자의 신원까지 증명하는 것은 아닙니다.
- 공개키는 서명을 검증하는 값이지, 사용자의 실명 신원을 증명하는 값은 아닙니다.