본문 바로가기
PYTHON/네트워크보안과 블록체인

[PYTHON] 비트코인 주소 생성 2 (특정 문자열로 시작하는 주소)

by G허니 2024. 8. 11.

 

비트코인(Bitcoin)은 2009년 사토시 나카모토라는 익명의 개발자가 제안한 디지털 통화로, 중앙은행이나 정부의 개입 없이 개인 간의 거래를 가능하게 하는 P2P(피어투피어) 시스템입니다. 비트코인은 블록체인 기술을 기반으로 하여 거래의 안전성과 무결성을 보장합니다. 블록체인은 거래 기록을 여러 개의 블록으로 묶어 체인 형태로 연결한 데이터베이스로, 모든 거래가 공개적으로 기록되며, 이를 통해 사용자는 거래의 진위를 검증할 수 있습니다.

 

  • 탈중앙화: 중앙기관 없이 사용자 간 직접 거래.
  • 한정된 공급량: 총 발행량이 2100만 개로 제한되어 있어 인플레이션에 강함.
  • 투명성: 모든 거래가 블록체인에 기록되어 누구나 확인 가능.

 

특정 문자열로 시작하는 비트코인 주소 생성
from Crypto.Hash import RIPEMD160
import base58check
import os
import random
import time
import hashlib

p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
G = [0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
     0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8]
a = 0
b = 7

def get_private_key():
    while True:
        random_str = os.urandom(256 // 8) + str(random.random()).encode() + str(time.time()).encode()
        random_num = hashlib.sha256(random_str).digest()
        private_key = int.from_bytes(random_num, 'big')
        if private_key < p:
            break
    return private_key

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, point2):
    if point1 == point2:
        w = (3 * point1[0] ** 2 + a) * find_inverse((2 * point1[1]), p) % p
    else:
        w = (point2[1] - point1[1]) * find_inverse(point2[0] - point1[0], p) % p
    x3 = (w ** 2 - point1[0] - point2[0]) % p
    y3 = (w * (point1[0] - x3) - point1[1]) % p
    return [x3, y3]

def double_and_add(x, G):
    binary = bin(x)[2:]  # Skip the '0b' prefix
    K = G
    for i in range(1, len(binary)):
        K = add(K, K)
        if binary[i] == '1':
            K = add(K, G)
    return K

def get_bitcoin_addr(hex_public_key):
    if int(hex_public_key[1], 16) % 2 == 0:
        x = "02" + hex(hex_public_key[0])[2:].zfill(64)
    else:
        x = "03" + hex(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)

    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)
    return str(bitcoin_addr)[2:-1]

def find_bitcoin_addr(want_str):
    private_key = get_private_key()
    public_key = double_and_add(private_key, G)
    hex_public_key = (hex(public_key[0]), hex(public_key[1]))
    addr = get_bitcoin_addr(hex_public_key)

    while want_str != addr[1:len(want_str)+1]:
        private_key = get_private_key()
        public_key = double_and_add(private_key, G)
        hex_public_key = (hex(public_key[0]), hex(public_key[1]))
        addr = get_bitcoin_addr(hex_public_key)
    
    print("주소 =", addr)

def is_valid_str(str):
    base58_alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
    for c in str:
        if c not in base58_alphabet:
            return False
    return True

want_str = input("희망하는 주소의 문자열: ")
while not is_valid_str(want_str):
    print("Base-58에 사용되는 문자가 아닙니다.")
    want_str = input("희망하는 주소의 문자열: ")

find_bitcoin_addr(want_str)

 

  1. 비공식적인 비트코인 키 생성: get_private_key() 함수는 무작위로 개인 키를 생성합니다. 이 개인 키는 비트코인 주소를 생성하는 데 사용됩니다.
  2. 점 추가 및 두 배: add()와 double_and_add() 함수는 타원 곡선의 점 연산을 수행하여 공개 키를 생성합니다.
  3. 주소 생성: get_bitcoin_addr() 함수는 생성된 공개 키를 기반으로 비트코인 주소를 생성합니다. 이 과정에는 SHA-256 및 RIPEMD-160 해싱이 포함됩니다.
  4. 주소 찾기: find_bitcoin_addr() 함수는 사용자가 원하는 문자열로 시작하는 비트코인 주소를 찾습니다. 무작위로 개인 키를 생성하고 반복하여 조건에 맞는 주소를 찾습니다.
  5. 유효한 문자열 검사: is_valid_str() 함수는 입력된 문자열이 Base-58 알파벳에 포함되는지 확인합니다.

이 코드를 통해 비트코인 주소를 생성하고, 사용자가 원하는 조건에 맞는 주소를 찾을 수 있습니다.

 

깃허브

https://github.com/Ghoney99/Network-Secure-and-BlockChain