I know about that. My goal is to do everything that from one file using only GMP.
By using only mathematical operations and calls in only one file, tremendous speed is achieved.
Here's the same script that does it in Python. But translating this to C++ is difficult.
import gmpy2
Gx = gmpy2.mpz('0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 16)
Gy = gmpy2.mpz('0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 16)
p = gmpy2.mpz('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F', 16)
n = gmpy2.mpz('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16)
def private_key_to_public_key(private_key):
Q = point_multiply(Gx, Gy, int(private_key), p)
compressed_public_key = compress_public_key(Q)
return compressed_public_key
def compress_public_key(Q):
x, y = Q
if y % 2 == 0:
return '02' + format(x, '064x')
else:
return '03' + format(x, '064x')
def point_multiply(x, y, k, p):
result = (gmpy2.mpz(0), gmpy2.mpz(0))
addend = (x, y)
while k > 0:
if k & 1:
result = point_add(result, addend, p)
addend = point_double(addend, p)
k >>= 1
return result
def point_double(point, p):
x, y = point
lmbda = (3 * x * x * gmpy2.powmod(2 * y, -1, p)) % p
x3 = (lmbda * lmbda - 2 * x) % p
y3 = (lmbda * (x - x3) - y) % p
return x3, y3
def point_add(point1, point2, p):
x1, y1 = point1
x2, y2 = point2
if point1 == (gmpy2.mpz(0), gmpy2.mpz(0)):
return point2
if point2 == (gmpy2.mpz(0), gmpy2.mpz(0)):
return point1
if point1 != point2:
lmbda = ((y2 - y1) * gmpy2.powmod(x2 - x1, -1, p)) % p
else:
lmbda = ((3 * x1 * x1) * gmpy2.powmod(2 * y1, -1, p)) % p
x3 = (lmbda * lmbda - x1 - x2) % p
y3 = (lmbda * (x1 - x3) - y1) % p
return x3, y3
key = "30568377312064202855"
public_key = private_key_to_public_key(key)
print(public_key)
result
0230210c23b1a047bc9bdbb13448e67deddc108946de6de639bcc75d47c0216b1b
