이더리움 - 서명, Public/Private Key

in #ethereum5 years ago (edited)

안녕하세요, 이더리움 코드보는 Sigmoid입니다.
오늘은 이더리움의 서명에 대해 알아보려고 합니다.

먼저 간단하게 "비대칭 키를 이용한 암호화 기법"에 대해 짚고 넘어가겠습니다.
비대칭 암호화란 Public(공통)/Private(개인) Key를 가지고 평문(PlainText)를 암호화하거나 해독하는 기술로서 일반적으로는 공통키로 암호화 한 데이터를 개인키로 해독하는 형태를 가집니다

예를 들어 온라인에 등록된 영화가 공통키로 암호화가 되어있고, 고객이 결제를 했을 경우 개인키를 공유해 줌으로서 결제한 사용자들만이 해당 영화를 시청가능하게 하는 방식입니다.

암호화 기법과는 달리, 서명은 개인키와 공통키를 완전히 다른 방식으로 활용합니다. 먼저 공통키를 모두에게 알립니다. 그 후 개인키로 원하는 데이터를 암호화하는 것이죠. 암호화 된 데이터에 몇가지 정보를 추가하여 전송하면, 수신자는 서명이 유효한지 확인하기 위해서는 공유된 정보를 통해 공통키를 생성하고, 이전에 수신 했던 공통키와 비교함으로서, 서명의 진위여부를 확인합니다.

이더리움 계정의 주소는 Public Key라는 것을 이미 알고 있으니, 우리는 트렌젝션을 수신했을 경우, 추가적으로 전달된 서명정보로 공통키를 재생성하여 주소와 비교하면 될것 입니다. 이더리움 트랜젝션의 구조를 보면 공통키를 재생성하기 위한 서명정보가 존재함을 확인할 수 있습니다. V,R,S 필드가 바로 그것입니다.

V, R, S필드가 어떻게 채워지는 지 살펴보았습니다.

먼저 위 구조체의 필드중 서명정보 윗부분의 데이터에 패딩 8바이트를 붙여서 RLP + HASH 합니다.

그다음 해당 결과값(메시지라고도 함)과 private키를 사용하여 서명함수를 호출합니다.

서명함수를 호출하면 V, R, S 값을 받게되는데, 이값을 트렌젝션 필드에 채우게 되면 서명이 완료됩니다.

특이한게 V값에 체인 ID 가 들어가 있는데, 이것은 서명과는 크게 상관없습니다.
EIP 155에서 제안된 replay 어텍 방지용 정보를 추가해놓은 것이에요.
실제로 서명정보를 확인할때는 V에서 1바이트인 recid(recognize id)만을 사용하게 됩니다.
타원 곡선의 특성상 하나의 R(x축) 포인트에 대해서 타원곡선의 값을 계산하기 위한
S값(y축)이 4개가 나옵니다.

R point에서 2개가 나오고, R modulo N(그룹오더) 위치에서 또 2개가 나오지요.
그래서 4개의 s 값중 어떤것을 사용했는지를 확인해야 합니다..
recid가 이 역할을 담당합니다.

걸러내는 방법은
먼저 복구된 4개의 S개중 high signature인 두개의 값은 무효화 됩니다. (N의 절반보다 위에 있는 값이 나왔다면 우리는 주소가 무효하다고 판단합니다.) 그리고 남은 2개 수중에서 recid가 음수/양수의 선택여부를 1과 0으로 구분해주죠.
(사실 4개 다사용해서 public key를 계산하고 서명에 쓰인 주소를 찾아내는 형태로 해도 됩니다만. 결국 v는 연산을 줄여주고 찾는 속도를 증가시켜줍니다)

추가적으로 이더리움 코드에서 공개키와 개인키 구조체는 아래 처럼 생겼습니다.

PrivateKey 구조체의 D필드가 실제 random으로 생성하는 개인키값입니다.


사용하는 타원곡선의 종류와, Private key를 통해 유도된 Public key에 해당하는 x,y좌표값, 그리고 그외 추가정보들이 들어있습니다.


추가정보로는 어떤 해시 함수를 쓰는가, 블록사이즈는 얼마인가 등이고, 실제 사용방식은 아래와 같네요.

도움이 되셨으면 좋겠습니다.

Coin Marketplace

STEEM 0.31
TRX 0.12
JST 0.034
BTC 64418.55
ETH 3157.64
USDT 1.00
SBD 4.06