Lecture 1.3 Digital Signatures

이 Post 는 Coursera 강의 “Bitcoin and Cryptocurrency Technologies” 와 해당 강의 저자의 draft 를 참고하여 작성된 것입니다.

Lecture 1.3 Digital Signature (디지털 서명)

[개요]

쉽게 생각하면 종이에서 이뤄지는 서명을 디지털 형태로 변경한 것이다. 서명을 통해 우리가 얻고자 하는 것은 두 가지이다.

  1. 당신이 서명을 하고 다른 사람들이 그것 (서명)을 보증할 수 있다.
  2. 서명이 특정 도큐먼트 (서류) 에 결합되어, 임의로 잘라내서 다른 서류에 붙여 넣을 수 없어야 한다.

조금 더 엄밀하게 디지털 서명 방식 (Digital Signature Scheme) 을 확인 해 보자.

디지털 서명은 아래와 같이 3가지 알고리즘으로 구성된다. :

(sk, pk) := generateKeys(keysize)

– generateKeys 함수는 keysize 를 input 으로 받아서 한 쌍의 key 쌍을 만든다. 비밀 키 (secret key) 와 공개 키 (public key) 가 그것이다. 비밀 키 (sk) 는 개인적으로 보관되고 공개 키 (pk) 는 공개 인증 키 (public verification key) 로써 당신이 다른 사람들에게 제공하는 것이다. 이 공개 키를 가진 사람은 당신의 서명을 검증할 수 있게 된다.

sig := sign(sk, message)

– 이 sign 함수는 비밀 키 (sk) 와 메시지 를 input 으로 받아서 서명 (signature) 를 output 으로 돌려준다.

– 서명 (signature) 은 비트 값으로 표현되는 일련의 문자열이다.

isValid := verify(pk, message, sig)

– verify 함수는 검증할 메시지와 공개 키 (pk), 그리고 디지털 서명 (sig) 를 input 으로 받아서 해당 서명 (sig) 이 참인지 거짓인지를 리턴한다.

 

한편, 디지털 서명은 다음의 두 가지 속성을 갖고 있다. :

● 유효한 서명은 다음을 보증한다.
verify(pk, message, sign(sk, message)) == true

● 서명은 위조불가 (unforgeable) 해야 한다.

 

[디지털 서명의 예시]

앞에서 디지털 서명 방식을 기술하였는데 아직 확실히 이해하기 어렵다. 하나의 디지털 서명과 이를 활용하는 방식을 예를 들어서 설명해 보겠다. 참조 사이트1사이트2를 통해 예를 확인했다.

  • Alice 는 디지털 서명할 파일을 선택한 뒤, 이메일 프로그램에서 ‘sign’ 버튼을 누른다.
  • 파일 내용에 대해 Hash 값이 만들어 진다.
  • 이 Hash 값은 Alice 의 개인 키 (private key) 에 의해 암호화 되어 하나의 디지털 서명이 작성된다.
  • 본래 데이터와 디지털 서명이 Bob 에게 전달 된다. (이메일로 전송된다.)
  • Bob 이 해당 이메일을 받고 나면, 이메일 어플리케이션은 해당 파일이 서명되었는지를 확인한다. Bob 의 컴퓨터는 다음과 같이 처리한다.
    • 디지털 서명을 Alice 의 공개 키를 통해 해독한다. (a)
    • 본래 파일의 Hash 값을 계산한다. (2)
    • (1) 을 통해 얻은 Hash 값과 (2) 의 Hash 값이 같은지 비교한다.
  • 어떤 차이점이 발견된다면 파일에 변조가 발생된 것이라고 판단된다.

 

 

[위조불가성 판별 게임 : Unforgeability game]

디지털 서명은 위조불가 (unforgeable) 해야 한다는 것은 악의를 가진 사람이 당신의 어떤 문서에 대한 공개 키 (public key) 를 활용해서 다른 문서의 디지털 서명을 위조해 내지 못함을 의미한다. 이 위조불가 속성은 침입자에 대항하는 하나의 게임으로 형상화 시킬 수 있는데 다음과 같다.

이 게임의 참가자는 challenger 와 attacker 로 구성된다. 먼저, generateKey 함수를 통해 비밀 키 (sk)와 공개 키 (pk) 한 쌍을 생성한다. challenger 는 비밀 키를 갖으며 attacker 는 공개 키를 갖는다. attacker 는 다수의 공개된 도큐먼트 (서류) 들을 알고 있으며 이중의 일부를 가짜 서명으로 속이는게 목적이다.

draft Figure 1.9

게임을 위해 attacker 는 도큐먼트 하나씩을 challenger 에게 전달하여 각 도큐먼트들의 서명을 받아낸다. attacker 가 원하는 만큼 여러번의 시도를 하여 여러 개의 디지털 서명을 확보한다. 충분하다고 생각되면 attacker 는 서명을 얻은 도큐먼트 이외의 도큐먼트에 대해 맞다고 생각되는 디지털 서명을 challenger 에게 보내 자신이 옳았는지 검증한다. 그가 확보한 서명들로 이 새로운 도큐먼트의 서명이 무엇인지 발견했다면 그는 승리한다!

어떤 알고리즘을 쓰더라도 실제적으로 attacker 가 승리할 확률은 매우 작다. 너무 작아서 현실 세계에서 그가 승리할 일은 없는 것이다.

 

[고려사항 : Practical Concerns]

디지털 서명을 현실세계에 적용하기 위해서 여러가지 고려사항이 있지만 크게 3가지 정도를 얘기한다.

① Algorithms are randomized :
알고리즘의 무작위성이 확보 되어야 한다. 그렇지 않으면 서명은 취약한 것이 되고 만다.

② Message size is limited :
제한된 크기의 비트열로 인해 디지털 서명에 사용되는 메시지 크기의 제약이 있다. 이 제약을 극복하는 손쉬운 방법은 메시지의 Hash 값을 가지고 서명하는 것이다. 앞 선 포스트에서도 살펴보았지만, 메시지의 Hash 값은 256 비트를 가지므로 디지털 서명하는데 제약이 없다. 이것은 Hash 값이 메시지의 분별 (message digest) 자로 기능하기 때문이다.

③ fun trick – sign a hash pointer :
한 가지 재미난 트릭은 Hash 값이 아닌 Hash Pointer 에 서명하는 것이다. 앞 선 포스트에서도 살펴 보았지만, Hash Pointer 에 서명하는 것은 해당 Hash Pointer 뿐 아니라 전체 구조를 확인하는 것이다. Hash Pointer 가 가리키는 블럭들을 모두 연결지어서 서명한다. 예를 들어 만약에 제일 마지막 블럭의 Hash Pointer 에 대해 서명하는 것은 전체 블럭 체인에 대해 서명하는 것과 같다.

 

[ECDSA : Elliptic Curve Digital Signature Algorithm]

비트코인의 경우 특정한 디지털 서명 방식을 채택하고 있다. 그것이 ECDSA 인데 특별히 128-bit 암호화를 갖는 “secp256k1” 표준을 사용중이다. 유독 비트코인에서만 이 표준을 사용하는데 ECDSA 방식을 사용하는 다른 활용처는, TSL 보안 웹 브라우징 같은 경우, 대개 “secp256r1” 표준을 사용하고 있다. Satoshi  가 이 표준을 채택하였는데, 지금은 바꾸기는 너무 커져 버렸다고 한다. ECDSA 는 서명 전에 메시지를 Hashing 하여 사용한다. 이 때문에 알고리즘의 무작위화 (randomness) 가 매우 중요하다.

Leave a Comment