PYTHON/네트워크보안과 블록체인
[PYTHON] 비트코인 주소 생성
G허니
2024. 8. 11. 20:21
비트코인(Bitcoin)은 2009년 사토시 나카모토라는 익명의 개발자가 제안한 디지털 통화로, 중앙은행이나 정부의 개입 없이 개인 간의 거래를 가능하게 하는 P2P(피어투피어) 시스템입니다. 비트코인은 블록체인 기술을 기반으로 하여 거래의 안전성과 무결성을 보장합니다. 블록체인은 거래 기록을 여러 개의 블록으로 묶어 체인 형태로 연결한 데이터베이스로, 모든 거래가 공개적으로 기록되며, 이를 통해 사용자는 거래의 진위를 검증할 수 있습니다.
- 탈중앙화: 중앙기관 없이 사용자 간 직접 거래.
- 한정된 공급량: 총 발행량이 2100만 개로 제한되어 있어 인플레이션에 강함.
- 투명성: 모든 거래가 블록체인에 기록되어 누구나 확인 가능.
비트코인 주소 생성
from Crypto.Hash import RIPEMD160
import base58check
import hashlib
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
G = [0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8]
a = 0
b = 7
def euclidian(b, n):
r1 = n
r2 = b if b > 0 else b + n
t1 = 0
t2 = 1
while r2 > 0:
q = r1 // r2
r = r1 - q * r2
r1 = r2
r2 = r
t = t1 - q * t2
t1 = t2
t2 = t
if r1 == 1:
return t1 if t1 > 0 else t1 + n
else:
return None
def euclidean_algorithm(a, b):
if b == 0:
return (a, 1, 0)
else:
gcd, x, y = euclidean_algorithm(b, a % b)
return (gcd, y, x - (a // b) * y)
def find_inverse(a, p):
gcd, x, y = euclidean_algorithm(a, p)
if gcd == 1:
return x % p
else:
return None
def add(point1: list, point2: list):
if point1 == point2:
w = (3 * point1[0] ** 2 + a) * euclidian((2 * point1[1]), p) % p
else:
w = (point2[1] - point1[1]) * euclidian(point2[0] - point1[0], p) % p
if w < 0:
w += p
x3 = (w ** 2 - point1[0] - point2[0]) % p
y3 = (w * (point1[0] - x3) - point1[1]) % p
if x3 < 0:
x3 += p
if y3 < 0:
y3 += p
point3 = [x3, y3]
return point3
def double_and_add(x, G: list):
binary = bin(x)
K = G
for i in range(3, len(binary)):
if binary[i] == '1':
K = add(add(K, K), G)
else:
K = add(K, K)
return tuple(K)
private_key = int(input("개인키 입력? "), 16)
public_key = double_and_add(private_key, G)
hex_public_key = (hex(public_key[0]), hex(public_key[1]))
if(int(hex_public_key[1], 16) % 2 == 0):
x = "02" + str(hex_public_key[0])[2:].zfill(64)
else:
x = "03" + str(hex_public_key[0])[2:].zfill(64)
x = bytes.fromhex(x)
x = hashlib.sha256(x).digest()
x = RIPEMD160.new(x).hexdigest()
x = "00" + str(x)
print("공개키 hash =", x)
public_key_hash = bytes.fromhex(x)
public_key_hash = hashlib.sha256(public_key_hash).digest()
public_key_hash = hashlib.sha256(public_key_hash).hexdigest()
checksum = str(public_key_hash)[:8]
bitcoin_addr = x + checksum
bitcoin_addr = bytes.fromhex(bitcoin_addr)
bitcoin_addr = base58check.b58encode(bitcoin_addr)
print("비트코인 주소 =", str(bitcoin_addr)[2:-1])
- 라이브러리: Crypto.Hash에서 RIPEMD160, base58check, hashlib을 불러옵니다.
- 파라미터 설정: 비트코인에서 사용하는 타원 곡선의 파라미터를 정의합니다.
- 유클리드 알고리즘: 두 수의 최대공약수를 찾고, 역원을 계산하는 함수입니다.
- 점 덧셈: 타원 곡선에서 두 점을 더하는 함수입니다.
- 스칼라 곱: 주어진 점과 스칼라 값을 곱하는 함수입니다.
- 개인키 입력: 사용자가 개인키를 입력하면, 이를 통해 공개키를 생성합니다.
- SHA-256 해싱: 공개키를 해싱하여 256비트 해시 값을 생성합니다.
- RIPEMD-160 해싱: SHA-256 해시 결과를 RIPEMD-160 해싱하여 비트코인 주소의 기본 해시를 생성합니다.
- 체크섬 생성: 두 번 SHA-256 해싱하여 체크섬을 생성하고, 이를 비트코인 주소에 추가합니다.
- Base58Check 인코딩: 최종 비트코인 주소를 Base58Check로 인코딩하여 출력합니다.
깃허브