이더리움은 외부 소유 계정(Externally Owned Account, EOA)과 컨트랙트라는 두 가지 유형의 계정을 갖고 있다.
개인키(private key), 이더리움 주소, 디지털 서명을 통해 외부 소유 계정의 이더 소유권을 확립한다.
이더리움 시스템은 개인키를 이더리움에 전송하거나 저장하는 방식으로 직접 사용하지 않는다. 즉, 개인키는 비공개로 유지되어야 하고, 네트워크로 전달된 메시지에 나타나지 않으며, 체인에 저장되어서도 안 된다. 계정 주소와 디지털 서명만 이더리움 시스템에 전송되고 저장된다. 개인키 자체는 이더리움 사용자에게 드러나는 경우가 거의 없다. 대부분 암호화된 형태로 특수 파일에 저장하고, 이더리움 지갑 소프트웨어로 관리한다.
이더리움 트랜잭션은 유효한 디지털 서명이 블록체인에 있어야 한다. 개인키의 사본을 가진 사람은 누구나 해당 계정과 해당 계정이 가진 이더를 제어할 수 있다. 사용자가 자신의 개인키를 안전하게 유지한다면, 이더리움 트랜잭션의 디지털 서명은 개인키의 소유권을 증명하기 때문에 자금의 실제 소유자임도 증명한다.
공개키 암호화는 고유한 키를 사용하여 정보를 보호한다. 이 키는 계산하기는 쉽지만 그 역을 계산하기는 어려운 수학 함수를 바탕으로 한다. 이런 함수를 바탕으로 한 암호화는 디지털 비밀과 위조 불가능한 디지털 서명을 만들 수 있으며, 이것은 수학 법칙에 의해 보장받는다.
암호화에 유용한 수학 함수는 타원 곡선의 산술 연산을 바탕으로 한다. 타원 곡선 산술에서 소수로 나눈 나머지를 곱하는 것은 간단하지만, 나눗셈은 사실상 불가능하다. 이것을 이산 로그 문제라고 한다. 타원 곡선 암호화(Elliptic Curve Cryptography)는 최신 컴퓨터 시스템에서 광범위하게 활용되며, 이더리움에서 개인키와 디지털 서명을 사용하는 기초가 된다.
이더리움에서는 공개키 암호화를 사용하여 공개키-개인키 쌍을 만든다. 공개키는 개인키에서 파생되므로 '쌍'으로 간주한다. 그와 함께, 그 쌍은 공개적으로 접근할 수 있는 계정 주소와 계정의 이더에 대한 접근 권한, 그리고 스마트 컨트랙트를 사용할 때 계정이 필요로 하는 모든 인증에 대한 사전 제어권을 제공함으로써 이더리움 계정을 나타낸다.
개인키는 계정에서 자금을 지출하게 위해 트랜잭션에 서명해야 하는 디지털 서명(Digital Signature)을 만드는 데 필요한 고유한 정보의 접근을 제어한다.
디지털 서명은 소유자 또는 컨트랙트 사용자를 인증하는 데도 사용한다.
디지털 서명을 만들어 모든 메시지에 서명할 수 있다. 이더리움 트랜잭션에서는 트랜잭션 자체의 세부사항이 메시지로 사용된다. 타원 곡선 암호화와 같은 암호학 방법은 메시지(트랜잭션 세부사항)를 개인키와 결합하여 개인키를 알아야만 만들 수 있는 코드(디지털 서명)를 생성한다.
이더리움 트랜잭션은 기본적으로 특정 이더리움 주소로 특정 계정에 접근하는 요청이다. 자금을 이동하거나 스마트 컨트랙트와 상호작용하기 위해 트랜잭션을 이더리움 네트워크로 보내면, 문제의 이더리움 주소에 해당하는 개인키로 생성된 디지털 서명도 함께 보내야 한다.
타원 곡선 수학이란 디지털 서명, 트랜잭션 세부 정보, 접근하려는 이더리움 주소가 일치하는지 확인하여 '누구나' 트랜잭션이 유효한지 확인할 수 있음을 의미한다. 이러한 확인 과정에는 개인키가 전혀 포함되지 않는다.
이더리움 프로토콜에는 암호화가 없기 때문에 이더리움 네트워크로 보내는 모든 메시지는 모든 사람이 읽을 수 있다. 따라서 개인키는 트랜잭션 인증을 위한 디지털 서명을 만드는 데에만 사용한다.
개인키는 단순히 무작위로 선택한 숫자다. 개인키의 소유권과 제어는 해당 주소를 승인하는 컨트랙트에 대한 접근뿐만 아니라 해당 이더리움 주소와 관련된 모든 자금에 대한 사용자 제어의 근원이다. 개인키는 트랜잭션에 쓰이는 자금의 소유권을 증명함으로써 이더를 소비하는 데 필요한 서명을 만드는 데 사용된다. 개인키는 항상 비밀로 유지해야 한다. 왜냐하면 개인키를 제3자에게 공개하는 행위는 개인키로 확보한 컨트랙트와 이더에 대한 제어 권한을 제3자에게 부여하는 것이나 마찬가지이기 때문이다.
키를 생성하는 가장 중요한 첫 번째 단계는 엔트로피, 즉 무작위성을 확보하는 것이다. 이더리움 개인키를 생성하는 것은 기본적으로 1에서 2^256 사이의 숫자를 선택하는 것이라고 볼 수 있다. 이더리움 소프트웨어는 기본 운영체제의 난수 생성기를 사용하여 256개의 임의 비트를 생성한다.
이더리움 공개키는 타원 곡선에 있는 점(point)으로 타원 곡선 방정식을 만족하는 x와 y의 좌표의 집합을 의미한다. 더 간단하게, 이더리움 공개키는 함께 결합된 2개의 숫자다. 이 숫자는 개인키로부터 단방향으로만 계산할 수 있다. 즉 개인키가 있는 경우 공개키를 계산하기는 쉽지만, 공개키에서 개인키를 계산할 수는 없다.
K = k G = (x, y)
k는 개인키, G는 생성자 점(generator point)이라고 불리는 상수점, K는 결과로 나오는 공개키, 는 특수 타원 곡선 '곱하기'연산자
타원 곡선 곱셈은 일반적인 곱셈과 같지 않다.
점(G)에 정수(k)를 곱하여 다른 점(K)를 생성할 수 있다. 그러나 나눗셈 같은 역 연산이 존재하지 않으므로 공개키 K를 G점으로 간단히 '나누어서' 개인키 k를 계산할 수 없다.
타원 곡선 암호화는 타원 곡선의 점에 더하기와 곱셈으로 표현되는 이산 대수 문제를 바탕으로 한 비대칭 또는 공개키 암호화 유형이다.
이더리움과 비트코인은 미국 표준기술연구소에서 제정한 secp256k1이라는 정확한 타원 곡선을 사용한다. 따라서 비트코인의 타원 곡선 라이브러리 및 도구를 이더리움에서도 사용할 수 있다.
이더리움에서 사용되는 디지털 서명 알고리즘은 ECDSA(Elliptic Curve Digital Signature Algorithm)이다. 디지털 서명은 이더리움에서 세 가지 용도로 사용된다.
첫째, 서명은 이더리움 계정과 개인키의 소유자가 이더 지출 또는 컨트랜트 이행을 승인했음을 증명(authentication)한다.
둘째, 부인 방지(non-reputation)를 보장한다.
셋째, 서명은 트랜잭션이 서명된 후에는 트랜잭션 데이터가 수정되지 않았고 어느 누구도 트랜잭션 데이터를 수정할 수 없음(integrity)을 증명한다.
이더리움의 ECDSA 구현에서 서명된 '메시지'는 트랜잭션이다. 또는 좀 더 정확하게 말하자면, 트랜잭션을 인코딩한 데이터의 Keccak-256 해시다. EOA의 개인키로 서명을 만든다.
서명 알고리즘은 처음에는 일시적인 임시 개인키를 암호학적인 안전한 방법으로 생성한다. 이 임시 키는 이더리움 네트워크에서 서명된 트랜잭션을 보는 공격자가 발신자의 실제 개인키를 계산할 수 없도록 r및 s값을 계산하는 데 사용된다.
-> 서명을 생성하는 데에는 개인키가 필요하지만, 그것을 검증하는 데에는 개인 키가 없어도 된다.
트랜잭션을 인코딩 -> 그 결과에 Keccak-256 해시 함수 적용 -> 그 결과와 개인키를 같이 서명 알고리즘에 적용 -> 결과 서명 얻음
결과 서명은 일반적으로 (r,s)라고 하는 두 값으로 구성된 Sig를 생성한다.
서명을 확인하려면 서명(r,s)과 트랜잭션, 그리고 서명을 만드는 데 사용된 개인키에 대응하는 공개키가 있어야 한다. 서명 확인은 공개키를 생성한 개인키의 소유자만이 트랜잭션에서 서명을 생성할 수 있음을 의미한다.
타원곡선 암호학 기반으로 전자 서명을 암호학적으로 보장하는 알고리즘
유한체 위의 타원 곡선 상의 순환군과 타원 곡선 이산 로그 문제를 기반으로 한다.
ECDSA 키와 서명은 같은 레벨의 RSA보다 더 짧다. (256 == 3072)SECG:SEC2나 Brainpool(RFC 5639) 등의 표준 타원 곡선 사용암호화를 위해 생성자 좌표 G와 순서 n(개인 키 길이)을 정의해야 한다.
secp256k1 곡선에서 개인 키는 256비트 정수/압축된 공개 키는 257 비트 정수
msg+privKey를 가지고 signature {r, s}를 만든다.
sha-256으로 msg를 해시
랜덤 숫자 k를 생성(결정적ECDSA에서는 k =메시지 해시값+개인키)
k*G = R를 계산해서 구한 x좌표가 r
서명 증거 s는공식을 통해 계산
서명은 사용된 개인 키보다 2배 길다
공개 키를 받아서 검증
msg의 해시값 계산
s의 모듈러 역수 계산s1
R' 복구 =s1* msg해시값 * G + r *s1*공개키
R'의 x좌표 계산r'
r ==r'