4. 암호학

✅ 키와 주소

이더리움은 외부 소유 계정(EOA)과 컨트랙트계정(CA) 두가지 유형의 계정을 갖고 있다.

디지털 개인키(private key), 이더리움 주소(Ethereum address), 디지털 서명(digital signature)을 통해 외부소유계정의 이더 소유권을 확립한다.

키와 주소는 지갑 또는 웰렛이라고 부르는 소프트웨어에 의해 생성되고 관리된다.

계정주소는 개인키에서 직접 파생되고, 개인키는 계정(account)라고 불리는 단일 이더리움 주소를 고유하게 결정한다.

개인키를 사용하여 생성된 디지털 서명을 통해 자금의 접근과 통제가 이루어진다.

이더리움 트랜잭션은 유효한 디지털 서명이 블록체인에 있어야 실행된다.

계정주소와 디지털 서명만 이더리움 시스템에 전송되고 저장된다.

 

이더리움 공개키 암호화 기반 시스템에서 키는 개인키와 공개키로 구성된 쌍으로 제공한다.

✅  공개키 암호화와 암호화폐

이더리움은 정보를 보호하기 위해 타원 곡선 암호화(ECC, Elliptic Curve Cryptography) 방식을 사용하여 공개키를 암호화한다.

타원 곡선 암호는 타원 곡선을 구성하는 여러 점들 위에서 덧셈 및 곱셈으로 표현되는 이산 로그 문제(discrete logarithm problem)를 기반으로 한 비대칭 또는 공개키 암호화 방식이다.

 

그리고 이더리움은 비트코인처럼 미국립표준기술원(NIST)에서 개발한 secco256k1이라고 부르는 표준 타원 곡선을 사용한다.

그래서 이더리움은 비트코인에서 사용하는 라이브러리 및 도구를 재사용 할 수 있다.

 

공개키는 개인키에서 파생되므로 '쌍'으로 간주한다.

그 쌍은 모든 인증에 대한 사적 제어권을 제공하므로 이더리움 계정을 나타낸다.

개인키는 계정에서 자금을 지출하기 위해 트랜잭션에 서명해야 하는 디지털 서명을 만드는 데 필요한 고유한 정보의 접근을 제어한다.

 

디지털 서명 : 메세지(즉, 트랜잭션 세부정보)를 개인키와 결합하여 개인키를 알아야만 만들 수 있는 코드 (타원곡선함호화로 생성됨)

이더리움 트랜잭션은 기본적으로 특정 이더리움 주소로 특정 계정에 접근하는 요청이다.

✅  개인키

개인키는 트랸쟉션에 쓰이는 자금의 소유권을 증명함으로써 이더를 소비하는데 필요한 서명을 만드는 데 사용된다

개인키는 단순히 무작위로 추출된 숫자이다.

(좀 더 정확하게 말하면, 개인키는 0과 n - 1 사이의 임의의 수이다. / n은 타원곡선의 위수(order)로 정의된 상수(n = 1.1578 * 10^77^, 2^256^보다 약간 작은 값))

개인키를 생성할 수 있는 범위(2256)를 10진수로 나타내면 약 1077이다.

비교를 위해 예를 들자면, 우주는 약 1080개의 원자로 구성되어 있다고 한다.

만약 개인키를 잃어버린다면 우주에서 바늘 찾기만큼 어렵다.

✅  공개키

공개키는 타원곡선에 있는 점으로 타원곡선 방정식을 만족하는 x,y좌표의 집합을 의미한다.

공개키는 타원곡선 곱셈 함수를 사용하여 개인키로부터 계산된다.

개인키로부터 '단방향으로만' 계산할 수 있다.

 

계산 공식은 다음과 같다.

 

K(공개키) = k(개인키) * G(생성지점이라고 하는 상수)

 

개인키에서 공개키는 계산할 수 있지만, 반대로 공개키에서 개인키는 계산할 수는 없다.

이산 로그(discrete logarithm) 찾기로도 알려져 있는 역계산법은 K값을 안다는 가정 하에 k값을 계산하는 것이다.

하지만, K값을 찾기 위해서는 가능한 k를 모두 대입하는 방법밖에 없기때문에 K값을 찾는 것은 거의 불가능에 가깝다.

랜덤으로 생성된 숫자 개인키(k)를 시작하여 생성지점 G라고하는 곡선의 미리 결정된 점을 곱하여 곡선상의 다른 점, 즉 대응하는 공개키(K)를 계산한다.

공개키(K)는 타원 곡선의 한 점으로 타원 곡선 방정식을 만족하는 X와 Y 좌표이다.

그래서 K = (x, y)로 정의된다.

공개키는 x좌표를 알면 y좌표를 대략 알 수 있다.

그래서 보통 y좌표가 상단인지 하단인지 구분하는 단일 비트와 x좌표만 사용하여 압축된 공개키를 사용한다.

압축되지 않은 공개키와 압축된 공개키는 모두 secp256k1 문서에 설명되어 있다.

✅ 이더리움 주소

이더리움 주소는 Keccak-256 단방향 해시 함수를 사용하는 공개키 또는 컨트랙트에서 파생한 고유 식별자다.

공개키 해시(Keccak-256)의 마지막 20바이트로 구성된다

공개키(K) X Y 좌표를 연결하고 16진수 문자열로 표시됨 -> Keccak-256을 사용하여 공개키의 해시를 계산 -> 공개키 해시의 마지막 20 바이트(최하위바이트)만 유지 -> 마지막으로 맨 앞에 "0x"를 붙여 이더리움 주소임을 표시

 

 

자바스크립트로 공개키에서 이더리움 주소를 생성할수있다.
이더리움 주소 생성에는 ethereumjs-util 라이브러리를 사용한다. 
ethereumjs-util 라이브러리를 사용하면 이더리움 주소를 간단하게 생성 할 수 있다.

✅ 이더리움 주소 형식

이더리움 주소는 16진수이며, 공개키 Keccak-256해시의 마지막 20바이트에서 파생한 식별자다.

이더리움 주소는 체크섬이 없는 원시 16진수로 표시한다.

그 결정의 근거는 이더리움 주소가 결국 시스템의 상위곛으에서 추상화(예. 이름서비스)에 숨겨지고 필요하다면 상위계층에 체크섬을 추가해야한다는 것이다.

 

이더리움 주소 유효성 체크는 EIP-55(Ethereum Improvement Proposal 55)에 제안된 내용이다. 

EIP-55는 이더리움 주소에 체크섬을 추가하여 주소의 무결성을 검증하고 오류로부터 보호한다. 

이 제안은 EIP-55가 적용되지 않은 이전 지갑에서도 전혀 문제를 일으키지 않는다.

16진수 문자열로 구성된 이더리움 주소에서 소문자를 체크섬 형태의 대문자로 바꾸기만 하면 된다.
EIP-55의 체크섬 주소를 사용하면 이더리움 주소의 오류를 감지할 수 있다.

만약 이더리움 지갑 소프트웨어를 개발할때 EIP-55를 적용하면 사용자가 이더리움 주소를 잘못 입력하여 송금하는 일을 사전에 방지할 수 있다.

728x90

'5. Blockchain > Mastering Ethereum' 카테고리의 다른 글

6. 트랜잭션(Tx)  (0) 2022.07.14
5. 지갑  (0) 2022.07.14
2. 이더리움 기초  (0) 2022.07.14
1. 이더리움이란 무엇인가?  (0) 2022.07.14
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유