본문 바로가기
Block Chain

Generating a Bitcoin Private Key and Address

by SpeeDr00t 2016. 8. 18.
반응형

Generating a Bitcoin Private Key and Address

ecdsa 설치
sudo pip install ecdsa

1.소스

import ecdsa
import ecdsa.der
import ecdsa.util
import hashlib
import os
import re
import struct



b58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'


def base58encode(n):


    result = ''

    while n > 0:

        result = b58[n%58] + result
        n /= 58

    return result



def base256decode(s):

    result = 0

    for c in s:
        result = result * 256 + ord(c)
    return result


def countLeadingChars(s, ch):


    count = 0

    for c in s:

        if c == ch:
            count += 1
        else:
            break

    return count



def base58CheckEncode(version, payload):


    s = chr(version) + payload
    checksum = hashlib.sha256(hashlib.sha256(s).digest()).digest()[0:4]
    result = s + checksum
    leadingZeros = countLeadingChars(result, '\0')

    return '1' * leadingZeros + base58encode(base256decode(result))



def privateKeyToWif(key_hex):    

    return base58CheckEncode(0x80, key_hex.decode('hex'))



def privateKeyToPublicKey(s):


    sk = ecdsa.SigningKey.from_string(s.decode('hex'), curve=ecdsa.SECP256k1)
    vk = sk.verifying_key

    return ('\04' + sk.verifying_key.to_string()).encode('hex')




def pubKeyToAddr(s):

    ripemd160 = hashlib.new('ripemd160')
    ripemd160.update(hashlib.sha256(s.decode('hex')).digest())
    return base58CheckEncode(0, ripemd160.digest())



def keyToAddr(s):

    return pubKeyToAddr(privateKeyToPublicKey(s))




# Generate a random private key
private_key = os.urandom(32).encode('hex')

# You can verify the values on http://brainwallet.org/
print "Secret Exponent (Uncompressed) : %s " % private_key 
print "Private Key     : %s " % privateKeyToWif(private_key)
print "Address         : %s " % keyToAddr(private_key)




결과


반응형