2014-09-28 15:52:50 +00:00
|
|
|
import ecdsa
|
2015-02-23 22:53:30 +00:00
|
|
|
import os
|
2014-09-28 15:52:50 +00:00
|
|
|
|
|
|
|
# secp256k1, http://www.oid-info.com/get/1.3.132.0.10
|
2017-08-24 17:07:00 +00:00
|
|
|
_p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
|
|
|
|
_r = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
|
|
|
|
_b = 0x0000000000000000000000000000000000000000000000000000000000000007
|
|
|
|
_a = 0x0000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
_Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
|
|
|
|
_Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
|
2014-09-28 15:52:50 +00:00
|
|
|
curve_secp256k1 = ecdsa.ellipticcurve.CurveFp(_p, _a, _b)
|
|
|
|
generator_secp256k1 = ecdsa.ellipticcurve.Point(curve_secp256k1, _Gx, _Gy, _r)
|
|
|
|
oid_secp256k1 = (1, 3, 132, 0, 10)
|
2017-08-24 17:07:00 +00:00
|
|
|
SECP256k1 = ecdsa.curves.Curve("SECP256k1", curve_secp256k1,
|
|
|
|
generator_secp256k1, oid_secp256k1)
|
2014-09-28 15:52:50 +00:00
|
|
|
ec_order = _r
|
|
|
|
|
|
|
|
curve = curve_secp256k1
|
|
|
|
generator = generator_secp256k1
|
|
|
|
|
2017-08-24 17:07:00 +00:00
|
|
|
|
2014-09-28 15:52:50 +00:00
|
|
|
def random_secret():
|
2023-02-01 16:31:10 +00:00
|
|
|
convert_to_int = lambda array: int("".join(array).encode("hex"), 16)
|
|
|
|
|
2017-08-24 17:07:00 +00:00
|
|
|
# Collect 256 bits of random data from the OS's cryptographically secure
|
2018-03-14 16:23:46 +00:00
|
|
|
# random number generator
|
2023-02-01 16:31:10 +00:00
|
|
|
byte_array = os.urandom(32)
|
|
|
|
|
|
|
|
return convert_to_int(byte_array)
|
2014-09-28 15:52:50 +00:00
|
|
|
|
2017-08-24 17:07:00 +00:00
|
|
|
|
2014-09-28 15:52:50 +00:00
|
|
|
def get_point_pubkey(point):
|
2017-12-10 14:44:04 +00:00
|
|
|
if (point.y() % 2) == 1:
|
2014-09-28 15:52:50 +00:00
|
|
|
key = '03' + '%064x' % point.x()
|
|
|
|
else:
|
|
|
|
key = '02' + '%064x' % point.x()
|
2023-02-01 16:31:10 +00:00
|
|
|
return key.decode('hex')
|
2014-09-28 15:52:50 +00:00
|
|
|
|
2017-08-24 17:07:00 +00:00
|
|
|
|
2014-09-28 15:52:50 +00:00
|
|
|
def get_point_pubkey_uncompressed(point):
|
2017-08-24 17:07:00 +00:00
|
|
|
key = ('04' +
|
|
|
|
'%064x' % point.x() +
|
|
|
|
'%064x' % point.y())
|
2023-02-01 16:31:10 +00:00
|
|
|
return key.decode('hex')
|
|
|
|
|
2015-01-18 20:21:22 +00:00
|
|
|
|
2014-09-28 15:52:50 +00:00
|
|
|
# Generate a new private key.
|
|
|
|
secret = random_secret()
|
2017-08-24 17:07:00 +00:00
|
|
|
print("Secret: ", secret)
|
2014-09-28 15:52:50 +00:00
|
|
|
|
|
|
|
# Get the public key point.
|
|
|
|
point = secret * generator
|
2023-02-01 16:31:10 +00:00
|
|
|
print("EC point:", point)
|
2014-09-28 15:52:50 +00:00
|
|
|
|
2023-02-01 16:31:10 +00:00
|
|
|
print("BTC public key:", get_point_pubkey(point).encode("hex"))
|
2014-09-28 15:52:50 +00:00
|
|
|
|
|
|
|
# Given the point (x, y) we can create the object using:
|
|
|
|
point1 = ecdsa.ellipticcurve.Point(curve, point.x(), point.y(), ec_order)
|
2017-08-24 17:07:00 +00:00
|
|
|
assert(point1 == point)
|