secp256k1
이라는 타원 곡선 알고리즘을 사용개인키에서 공개키를 만드는 방법?
곡선 위의 한 점 𝐾 = 𝑘 × 𝐺
k (1 ≤ k < n, n은 곡선의 정수 순환 수)
- 𝑘 = 무작위 256비트 정수 = 개인 키(Private Key)
- G = 곡선 상의 기본점(generator point) (모두가 아는 고정 값)
- ×는 일반 곱셈이 아니라 점 덧셈(point addition)을 반복하는 연산
- 해당 연산은 𝑘 → 𝐾 만 가능하며, 그 반대는 이산로그 문제로 인해 실질적으로 불가능
- 즉, 다른 사람들은 𝐾 를 보고 몇 번 돌렸는지 절대 추측 불가
비트코인에서 주소를 생성하는 법
- 공개키를 압축하여 압축 공개키로 변환
SHA-256
함수 실행
- 결괏값은 이름처럼 항상 256bits(32B)로 고정
- cf. 아래 주소에서 SHA-256 함수를 실험해볼 수 있다.
https://andersbrownworth.com/blockchain/hash- 2의 결괏값을
RIPEMD-160
해시 함수에 입력
RIPEMD-160
해시 함수는SHA-256
에 비해 충돌 저항성이 강함- 즉, 같은 주소에 대해 여러 소유자가 발생하는 오류 방지 가능
- 앞에 버전(version)데이터 삽입
- [버전] + [3의 결과]
- 4의 결과를
SHA-256
해시 함수에 두 번 넣은 후, 해당 결괏값의 맨 앞 자리 4개를 체크섬(checksum)으로 사용
- [버전] + [3의 결과] + [체크섬]
- 최종 데이터를
Base58
인코딩 방식을 통해 사람이 읽을 수 있는 문자열로 변환
개인키(k, 랜덤 큰 수)
└─ ECC 곡선 연산(k × G)
→ 공개키(K, 곡선 위 점)
└─ 해시 & 압축
→ 주소(사람/네트워크가 쓰는 표기)