2017-09-06 04:44:52 +00:00
|
|
|
from __future__ import print_function
|
2021-03-08 14:59:01 +00:00
|
|
|
import cryptos
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Generate a random private key
|
|
|
|
valid_private_key = False
|
|
|
|
while not valid_private_key:
|
2021-03-08 14:59:01 +00:00
|
|
|
private_key = cryptos.random_key()
|
|
|
|
decoded_private_key = cryptos.decode_privkey(private_key, 'hex')
|
|
|
|
valid_private_key = 0 < decoded_private_key < cryptos.N
|
2014-08-27 20:08:43 +00:00
|
|
|
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Private Key (hex) is: ", private_key)
|
|
|
|
print("Private Key (decimal) is: ", decoded_private_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Convert private key to WIF format
|
2021-03-08 14:59:01 +00:00
|
|
|
wif_encoded_private_key = cryptos.encode_privkey(decoded_private_key, 'wif')
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Private Key (WIF) is: ", wif_encoded_private_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Add suffix "01" to indicate a compressed private key
|
|
|
|
compressed_private_key = private_key + '01'
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Private Key Compressed (hex) is: ", compressed_private_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Generate a WIF format from the compressed private key (WIF-compressed)
|
2021-03-08 14:59:01 +00:00
|
|
|
wif_compressed_private_key = cryptos.encode_privkey(
|
|
|
|
cryptos.decode_privkey(compressed_private_key, 'hex'), 'wif')
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Private Key (WIF-Compressed) is: ", wif_compressed_private_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Multiply the EC generator point G with the private key to get a public key point
|
2021-03-08 14:59:01 +00:00
|
|
|
public_key = cryptos.fast_multiply(cryptos.G, decoded_private_key)
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Public Key (x,y) coordinates is:", public_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Encode as hex, prefix 04
|
2021-03-08 14:59:01 +00:00
|
|
|
hex_encoded_public_key = cryptos.encode_pubkey(public_key, 'hex')
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Public Key (hex) is:", hex_encoded_public_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Compress public key, adjust prefix depending on whether y is even or odd
|
|
|
|
(public_key_x, public_key_y) = public_key
|
2017-08-24 16:27:27 +00:00
|
|
|
compressed_prefix = '02' if (public_key_y % 2) == 0 else '03'
|
2021-03-08 14:59:01 +00:00
|
|
|
hex_compressed_public_key = compressed_prefix + (cryptos.encode(public_key_x, 16).zfill(64))
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Compressed Public Key (hex) is:", hex_compressed_public_key)
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Generate bitcoin address from public key
|
2021-03-08 14:59:01 +00:00
|
|
|
print("Bitcoin Address (b58check) is:", cryptos.pubkey_to_address(public_key))
|
2014-06-02 19:04:18 +00:00
|
|
|
|
|
|
|
# Generate compressed bitcoin address from compressed public key
|
2017-08-24 16:27:27 +00:00
|
|
|
print("Compressed Bitcoin Address (b58check) is:",
|
2021-03-08 14:59:01 +00:00
|
|
|
cryptos.pubkey_to_address(hex_compressed_public_key))
|