이더리움은 탈중앙화된 블록체인 플랫폼으로, 사용자는 개인 키(프라이빗키)와 공개 키(퍼블릭키), 그리고 주소(Address)를 통해 자신의 자산을 관리합니다. 이 글에서는 이더리움 주소와 프라이빗키의 관계를 수학적으로 이해하고, 각 요소가 어떻게 연결되는지 자세히 설명합니다.
프라이빗키란 무엇인가?
프라이빗키는 256비트 길이의 무작위 숫자로, 사용자가 소유한 이더리움 자산에 접근할 수 있는 유일한 수단입니다. 일반적으로 16진수로 표현되며, 총 64자리로 구성되어 있습니다. 예를 들어:
0x4c0883a69102937d6231471b5dbb6204fe51296170827920a2076b53f38d2d0f
이 프라이빗키는 절대 외부에 공개되어서는 안 되며, 유출될 경우 자산을 도난당할 수 있습니다.
공개키 생성 과정
프라이빗키에서 공개키는 타원곡선 암호 알고리즘(Elliptic Curve Cryptography, ECC)을 통해 생성됩니다. 이더리움은 secp256k1이라는 곡선을 사용하며, 수학적으로는 다음과 같이 표현할 수 있습니다:
\[ K = k \cdot G \]
여기서:
- \( k \)는 프라이빗키
- \( G \)는 곡선 상의 생성점(Generator Point)
- \( K \)는 공개키
ECC 연산은 단방향 함수이기 때문에, 공개키를 가지고 프라이빗키를 역산할 수 없습니다.
이더리움 주소 생성 과정
공개키에서 이더리움 주소를 생성하는 과정은 다음과 같은 순서를 따릅니다:
- 공개키 \( K \)를 Keccak-256 해시함수로 해싱한다.
- 해시된 결과의 마지막 20바이트(40자리 16진수)를 추출한다.
- 여기에
0x를 앞에 붙이면 이더리움 주소가 된다.
예를 들어, 공개키가 아래와 같다면:
0x04bfcab1c0a7f2d7285cb05c36d9fffaedc7c6... (생략)
Keccak-256 해시를 적용하면:
0x5d1c6f7e4505f40b184f857fb955e6f4b35d5801d77cdade... (생략)
마지막 40자리를 추출하면 주소는 다음과 같습니다:
0x5d1c6f7e4505f40b184f857fb955e6f4b35d5801
주소와 프라이빗키의 관계
이더리움 주소는 프라이빗키로부터 생성된 공개키를 다시 해싱하여 만들어진 값입니다. 즉, 프라이빗키 → 공개키 → 주소의 단방향 구조를 갖습니다. 이 관계 덕분에 프라이빗키를 보유한 사람만이 해당 주소의 자산을 이동시킬 수 있습니다.
주소 자체는 프라이빗키나 공개키에 비해 노출되어도 보안상 큰 문제가 없지만, 프라이빗키가 노출되면 해당 주소의 모든 자산을 도난당할 수 있으므로 철저한 보안이 필요합니다.
실제 예시로 보는 키 생성
다음은 실제로 키를 생성하는 간단한 예시입니다 (Python 언어 사용):
from eth_account import Account
acct = Account.create()
print("Private Key:", acct.key.hex())
print("Address:", acct.address)
이 코드는 새로운 프라이빗키와 이더리움 주소를 생성하며, 주소는 자동으로 공개키로부터 파생됩니다.
결론
프라이빗키란 무엇인가?: 프라이빗키는 자산의 소유권을 증명하는 핵심 요소로, 무작위로 생성되는 256비트 숫자입니다.
공개키 생성 과정: 프라이빗키로부터 타원곡선 연산을 통해 공개키가 생성됩니다. 이는 단방향 연산으로 복원이 불가능합니다.
이더리움 주소 생성 과정: 공개키를 Keccak-256 해시하여 마지막 20바이트를 추출하면 이더리움 주소가 됩니다.
주소와 프라이빗키의 관계: 프라이빗키 → 공개키 → 주소 순으로 파생되며, 보안상의 이유로 프라이빗키는 절대 노출되어서는 안 됩니다.
실제 예시: Python 코드로 손쉽게 새로운 키 쌍과 주소를 생성할 수 있습니다.