Blockchain 기술

디지털 서명

거래를 수학적으로 확인하는 방법은 디지털 서명
토픽 내용을 시작하기 전에 먼저 다음과 같이 마음속으로 속삭여 보시라고 말씀드리고 싶네요.
"나는 내용이 아무리 어렵게 쓰여 있어도 아주 쉽게 받아 들일 수 있다!"
방금 학습에 있어서 매우 중요한 것을 알려드렸습니다. 어떤 것을 접하더라도 할 수 있다는 믿음이 있다면 그 학습 능력은 놀랄만치 올라간다는 것을요.

이전 토픽에서 거래에 대해서 개인키로 서명을 한다고 하였는데, 이것을 바로 디지털 서명이라고 합니다. 디지털 서명을 설명하기 위해서는 개인키(Priviate Key), 공개키(Public Key), 주소(Address)의 개념 설명이 필요합니다. 그냥 암호 하나면 되지 않나 하실 수 있는데, 블락체인에서는 거래(Transaction)가 모든 사람에게 공개가 되기 때문에 단순 암호 방식으로는 보안 문제가 발생합니다.

설명을 위해 비트코인의 디지털 서명 방식을 예로 들겠습니다. 아마도 대부분의 가상화폐가 비트코인과 같은 디지털 서명 방식을 사용할 것입니다.

그럼 먼저 개인키, 공개키, 주소는 어떤 관계 일까요? 아래 그림을 보시죠.

 

[개인키, 공개키, 주소의 관계, 출처]

위 그림에서 개인키(k)와 공개키(K), 그리고 주소(A)는 어떤 함수로 연결되어 있습니다. 즉 이들은 쌍을 이룬다는 것을 알 수 있습니다. 좀 더 자세히 그림을 살펴보면 개인키를 타원곡선 곱셈함수(Eliptic Curve Multiplication)에 대입하면 바로 공개키가 얻어지는 것입니다. 그리고 이 공개키를 다시 해슁 함수(Hashing Function)에 대입하면 바로 주소가 얻어집니다. 위 그림에서 나타났듯이 공개키와 주소는 엄밀히 같은 것이 아닙니다. 공개기에서 주소가 파생되지만 해슁 함수로 연결되어 있는 구성입니다. 나중에 혼동 안되지 않도록 주의합니다.

공개키와 주소는 엄밀히 얘기하면 같은 것이 아니다.

 

그림을 잘 보면 오른쪽으로 향하는 화살표가 있고, 왼쪽으로 향하는 화살표가 있습니다. 오른쪽으로 향하는 화살표는 위에서 설명드린대로 키가 변환되는 과정입니다. 그런데 왼쪽으로 향하는 화살표에는 '금지'표시가 있습니다. 즉 주소에서 공개키를 얻는게 안되고, 공개키에서 개인키를 얻는게 안된다는 것을 의미합니다. 따라서 공개키와 주소가 다른 사람에게 공개되어도 개인키를 공개되지 않고 안전하게 사용할 수 있게 됩니다. 여기서 안된다고 했는데, '거의 불가능'하다가 정확한 표현일 것입니다. 만약 '거의 불가능'한 것이 '가능'하게 되면 현대의 암호체계는 다시 만들어야 겠지요.

블락체인의 보안은 '암호'가 아닌 개인키, 공개키 쌍을 이용합니다.

 

타원곡선 곱셈함수는 그 내용이 까다로와 생략하겠습니다. 세부적인 내용이 알고 싶다면 이곳이나 이곳을 참고바랍니다. 지금은 그냥 한쪽 방향으로만 계산이 수월하고 역으로 계산하는 것은 무지 무지 어렵워서 개인키를 암호화하는데 쓰인다고만 이해하고 넘어가도록 하겠습니다. 그 다음으로 설명드릴 부분이 해슁 함수(Hashing Function)입니다. 위 그림에서 보면 이 해슁 함수도 한방향(One-way)라도 표시되어 있습니다. 즉 한쪽 방향으로만 계산이 쉽고, 역방향은 계산이 매우 어렵다는 의미입니다. 이 해슁 함수는 매우 중요한 개념이고 설명이 어렵지 않아 반드시 이해하고 넘어가도록 하죠.

해슁 함수의 특징은 크게 세 가지 입니다.

  1. 한방향 함수이다. 역방향 계산은 무지 무지 어렵다
  2. 함수의 입력의 크기와 상관없이 출력의 크기가 동일하다
  3. 함수의 입력이 털끝이라도 바뀌면 출력은 완전 달라진다

​2번과 3번에 대한 내용을 아래 그림으로 살펴보시죠.

원본이 조금만 수정되어도 완전히 다른 해시값을 가지게 된다

[출처: organic media lab]

위 그림을 잘 보시면 문구에 아주 작은 차이가 있습니다. 보이시나요? 금액이 만원과 십만원으로 차이가 납니다. 각각을 해슁 함수의 입력으로 넣었더니 16진수로 4자리의 출력값을 얻었습니다. 예에서는 출력이 4자리로 나왔지만 비트코인에서는 해슁 함수로 SHA256이란 것을 사용하는데 256자리의 출력값이 얻어지게 됩니다. 중요한 것은 해슁 함수는 입력이 뭐든 출력의 크기가 같다는 것입니다. 

그리고, 입력이 아주 털끝만큼 변경되어도 그 출력은 전혀 달라지는 것이 해슁 함수의 특징입니다. 왜 이게 중요할까요? 그것은 해슁 함수의 출력값으로 입력값을 유추할 수 없도록 되어 있다는 것입니다. 이 특징은 이후에 설명할 채굴작업에 필수적입니다.

해슁 함수는 블락체인에 있어서 필수적인 요소입니다.

 

내용이 점점 길어지고 있지만 드디어 디지털 서명에 대한 설명 들어갑니다. 우리가 인터넷 뱅킹을 사용할 때 인증서 암호를 입력하는 방식은 은행 서버에 암호가 저장되어 있고, 우리가 입력한 것이 서버의 암호와 일치하면 거래를 승인하는 방식입니다. 따라서 암호는 매우 '비밀스럽게' 다루어 져야만 합니다. 이런 방식은 내가 주의하더라도 서버가 누군가에 의해 해킹당하면 내 계좌의 돈이 털릴 수 있는 위험이 있는 구조입니다.(인터넷 뱅킹도 개인키, 공개키 구조입니다.)   반면에 비트코인은 위에서 얘기한 개인키, 공개키 쌍을 이용합니다. 개인키는 말 그대로 개인만 보관하는 것입니다. 은행 서버나 이런데 저장되는 것이 아니죠. 그냥 내 PC에만 저장되어 있는 것입니다(온라인 지갑을 사용한다면 웹에 암호화되어 저장되어 있기도 합니다.) 그리고 공개키는 말 그대로 남들에게 공개하는 것입니다.

블락체인은 개인키, 공개키 쌍으로 보안을 유지합니다.

 

블락체인에서 거래를 전송할 때, 거래 내역을 개인키로 '서명(암호화)'하고, 서명한 거래내용과 함께 서명에 사용된 개인키와 쌍을 이루는 공개키를 같이 전송합니다. 이 거래의 수신자는 거래내용와 함께 수신된 공개키로 거래내용을 열어서 거래내용의 원본과 동일한지 비교하게 됩니다. 이렇게 두 거래내용이 동일하다면 공개키 주인이 보낸 것임을 확신할 수 있게 되는 것입니다. 이것을 아래 그림으로 보시면 이해가 더 잘 될 것입니다.

디지털 서명은 보낸 사람이 작성한 문서가 맞는지 확인하는데 사용된다

[출처: organic media lab]

위 설명과 그림이 조금 다른데요. 그것은 거래내용 자체를 개인키로 암호화하는 것이 아니라 거래내용을 해슁 함수를 통해서 해쉬값을 얻고, 이 해쉬값을 개인키로 암호화하여 거래내용 원문과 함께 공개하게 되는 것입니다. 즉 원문 자체를 개인키로 암호화 하지 않고, 원문의 해쉬값을 암호화합니다. 이렇게 하면 원문이 아무리 길더라도 고정된 해쉬값만 암호화 하면 되므로, 계산적 이득이 됩니다.

거래의 수신자는 송신자의 공개키와 거래내용을 수신하면, 송신자가 서명한 부분을 송신자의 공개키로 엽니다. 그리고 그 값이 수신한 거래내용의 해쉬값과 동일한지를 검토하여 거래를 검증합니다. 거래 순서를 위 그림의 내용으로 한 번 요약하면 아래와 같습니다.

  1. 송신자는 거래내용을 해슁 함수에 입력하여 해쉬값을 얻는다
  2. 해쉬값을 송신자의 개인키로 암호화하여 서명하고, 서명을 원문 거래내용, 송신자의 공개키와 함께 전송한다.
  3. 수신자는 암호화된 서명부분을 송신자의 공개키를 이용하여 연다.
  4. 수신자는 암호가 풀린 서명부분과 원문 거래내용의 해쉬값을 비교하여 거래를 검증한다.

이렇게 디지털 서명해서 코인의 소유권이 이전되었음을 모두에게 알리고 이를 블락체인에 영구히 기록, 보존하게 되어 있습니다.

디지털 서명은 거래를 수학적으로 확인하는 방법입니다.

 

이번 토픽의 홈워크는 Blockchain.info에 방문해서 비트코인 지갑을 만들어 보는 것입니다. 만들어진 비트코인 주소를 댓글에 남겨주세요.

블락체인 기반 블로그 Steemit에 Vote가 10개 이상되면 다음 타픽 진행하겠습니다.(희망사항)

Steemit 바로가기

https://steemit.com/blockchain/@etainclub/blockchain-5

댓글

댓글 본문
  1. moony
    19MhYQ2iBmeSFBbFY1SAVnUKDQDpongDVa
  2. 1KRNUZTJqCqGc9KhKwXokBQZ6NeC36JoWK
  3. 맞는데 비공개키라고 하기보다는 개인키라고 하죠 ㅋㅋㅋ
    대화보기
    • 공개키로 암호화한건 비공개키로 풀 수 있고
      비공개키로 암호화한건 공개키로 풀 수 있습니다
      https://brunch.co.kr....../24
      대화보기
      • 리버트
        안녕하세요, 디지털 서명방식을 보던중 제가 알고있던것과 너무도 다르고, 그림과 글로는 공개키에 대한 감이 전혀 잡히지 않아서 상세히 좀 여쭙고 싶습니다 :)
        위의 그림에서 [거래내용]을 hash하여 암호화된 해시값과 개인키를 이용해서 다시 해시값을 얻는데.
        해시 특성상 복호화가 이론상 거의 불가능 한데 수신자는 송신자의 공개키[myAddr]를 가지고 어떻게 내용을 알 수 있다는건지요?
        다시 정리를 해보면..

        송신자 :
        1. 거래내용 => hash => 006a
        2. 006a + suza&!1d => hash => ㅣㅕ롶ㄴ

        수신자 : ㅣㅕ롶ㄴ 이미 해시된 값을 myAddr로 어떻게.. 복원 한다는건지 모르겠습니다.
      • 맛있는하마
        17FxyocTyYf8rzPvs4AzcJcnRV6JdhmjA3
      • 쌍우
        1JC89FLbzN69Vyw2tAu3P2z5LWNCZbaT9w
      • 트둥
        17NxHusKrAUeYmisd5s9q8HVphybFDwdLY
      • 이타인
        오류 지적 고맙습니다. 제가 공인인증서 방식을 대충 검색만 해서 잘못설명했네요. 아래 댓글에도 유사한 지적을 해주셔서 알게됐습니다. 고맙습니다~
        대화보기
        • 길버트
          잘 써주신글 도움이 많이 되었습니다. 감사합니다. 다만 한가지 오류가 있어 말씀드립니다. 은행 이체시에도 전자서명이 이루어집니다. 내 암호가 은행에 저장되는 것이 아니라 공개키가 등록되는 것이라고 보셔야합니다. 우리가 일반적으로 얘기하는 공인인증서는 사실 개인키를 의미합니다. 키쌍 생성도 개인 PC의 암호모듈에서 수행하며 개인키는 어디로도 전송되지 않습니다. 현재 공인인증체계에서는 타원곡선을 사용하지 않고 RSA를 사용합니다.
        • 이타인
          비트코인 주소하나 가지고 있으면 기분 좋죠~
          비트코인 좀 보내달라고 할 때 요긴하게 쓸수 있겠죠.

          말씀하신 공인인증서 부분을 찾아봤는데, 정말 비슷한 방식이네요.
          아래 사이트에 공인인증서 동작 방식에 대해서 자세히 나와 있네요.
          http://soul0.tistory.com/372

          저는 공인인증서는 개인키를 서버에 저장하는 줄 알았는데 그게 아닌가 봅니다.
          공인인증서로 인증할 때 서버 접속이 필요없다고도 하는데, 이 부분은 좀 더 찾아봐야겠네요.
          좋은 질문 고맙습니다~
          대화보기
          • 동모동모
            1Q9F2kgbPANkEoWz6Na8F1S7GWTaKf669

            덕분에 비트코인 지갑도 만들어보네요.. ^^
            그런데 블록체인의 개념이 우리나라에서 사용 중인 공인인증서 운영방식과 상당히 유사한 것 같은데..
            Public Key, Private Key 이런 개념이요~
            공인인증서를 발급받아서 사용한다는 부분을 제외하고는
            어떤 차이가 있는지 사실 잘 이해가 안되네요 ㅠ
          • 이타인
            재밌게 봐주시니 저도 기쁩니다.

            네 1 비트코인 사려면 5백만원이 필요합니다.
            정말로 사려면 거래소에 입금해야 합니다. 코인원이나 코십이나 빗썸과 같은 거래소예요.
            대화보기
            • Seon Yi
              1YD63FMbbB2TSzHExkFmFFbAbz2pbu1rw
              재미있어요, 좋은 강의 고맙습니다 :)

              블록체인 홈페이지에 우상단에 "1 BTC = ₩5,000,000.00", "1 ETH = ₩348,245.02"라고 나와있는데 그럼 제가 1 비트코인을 사기 위해서는 500만원을 가상지갑에 넣어야 하나요?
            • 이타인
              네 보통 지갑은 주소형태가 아닙니다. 개념적으로 주소를 담는 툴, 또는 앱이라고 보시면 됩니다.
              답글 남겨주셔서 고맙습니다.
              하나 하나 알아가는 재미가 있죠.
              대화보기
              • yoniverse
                1N4CjJk5bDWRAhrwpodLRr3LBvtvo3fJZq
                처음에 Wallet ID랑 헷갈렸는데, Wallet ID는 로그인시 쓰는거고
                위에 강사님이 말씀하신 고유 주소가 bitcoin 주소네요.
                아직 좀 낯설긴한데 재밌습니다. 감사합니다.
              • 이타인
                1PeDHyKCMpD9hGsKgEp7L55iveJGr46QhH