I've been struggling with this script for days.
I tried chatgtp to help me today and it didn't work.
ChatGtp is like a broken washing machine.. The drum rotates but does not receive water, so nothing happens.
#include <gmp.h>
mpz_t Gx, Gy, p, n;
void private_key_to_public_key(mpz_t private_key, mpz_t Q[2]);
void point_double(mpz_t point[2], mpz_t p);
void point_add(mpz_t point1[2], mpz_t point2[2], mpz_t p);
int main() {
mpz_t dec, public_key[2];
mpz_inits(dec, public_key[0], public_key[1], NULL);
mpz_set_str(Gx, "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16);
mpz_set_str(Gy, "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16);
mpz_set_str(p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16);
mpz_set_str(n, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16);
mpz_set_str(dec, "30568377312064202855", 10);
gmp_printf("Initial Private Key: %Zd\n", dec);
gmp_printf("Gx: %Zx\n", Gx);
gmp_printf("Gy: %Zx\n", Gy);
private_key_to_public_key(dec, public_key);
char public_key_hex[130];
gmp_sprintf(public_key_hex, "02%0*Zx", (int)(mpz_sizeinbase(public_key[0], 16) + 1), public_key[0]);
printf("Computed Public Key: %s\n", public_key_hex);
// Print EC Point Coordinates
gmp_printf("EC Point Coordinates:\nX %0*Zx\nY %0*Zx\n",
(int)(mpz_sizeinbase(public_key[0], 16) + 1),
public_key[0],
(int)(mpz_sizeinbase(public_key[1], 16) + 1),
public_key[1]);
mpz_clears(Gx, Gy, p, n, dec, public_key[0], public_key[1], NULL);
return 0;
}
void private_key_to_public_key(mpz_t private_key, mpz_t Q[2]) {
mpz_t result[2], addend[2];
mpz_inits(result[0], result[1], addend[0], addend[1], NULL);
mpz_set_ui(result[0], 0);
mpz_set_ui(result[1], 0);
mpz_set(addend[0], Gx);
mpz_set(addend[1], Gy);
while (mpz_cmp_ui(private_key, 0) > 0) {
if (mpz_odd_p(private_key)) {
point_add(result, addend, p);
}
point_double(addend, p);
mpz_fdiv_q_2exp(private_key, private_key, 1);
}
mpz_set(Q[0], result[0]);
mpz_set(Q[1], result[1]);
mpz_clears(result[0], result[1], addend[0], addend[1], NULL);
}
void point_double(mpz_t point[2], mpz_t p) {
mpz_t lmbda, x3, y3;
mpz_inits(lmbda, x3, y3, NULL);
mpz_mul_ui(lmbda, point[0], 3);
mpz_mul(lmbda, lmbda, point[0]);
mpz_mul_ui(lmbda, lmbda, 2);
mpz_mod(lmbda, lmbda, p);
mpz_invert(lmbda, lmbda, p);
mpz_mul(x3, lmbda, lmbda);
mpz_sub(x3, x3, point[0]);
mpz_sub(x3, x3, point[0]);
mpz_mod(x3, x3, p);
mpz_sub(y3, point[0], x3);
mpz_mul(y3, y3, lmbda);
mpz_sub(y3, y3, point[1]);
mpz_mod(y3, y3, p);
mpz_set(point[0], x3);
mpz_set(point[1], y3);
mpz_clears(lmbda, x3, y3, NULL);
}
void point_add(mpz_t point1[2], mpz_t point2[2], mpz_t p) {
mpz_t lmbda, x3, y3;
mpz_inits(lmbda, x3, y3, NULL);
if (mpz_cmp(point1[0], point2[0]) == 0 && mpz_cmp(point1[1], point2[1]) == 0) {
point_double(point1, p);
} else {
mpz_sub(lmbda, point2[1], point1[1]);
mpz_sub(x3, point2[0], point1[0]);
mpz_invert(x3, x3, p);
mpz_mul(lmbda, lmbda, x3);
mpz_mod(lmbda, lmbda, p);
mpz_mul(x3, lmbda, lmbda);
mpz_sub(x3, x3, point1[0]);
mpz_sub(x3, x3, point2[0]);
mpz_mod(x3, x3, p);
mpz_sub(y3, point1[0], x3);
mpz_mul(y3, y3, lmbda);
mpz_sub(y3, y3, point1[1]);
mpz_mod(y3, y3, p);
mpz_set(point1[0], x3);
mpz_set(point1[1], y3);
}
mpz_clears(lmbda, x3, y3, NULL);
}
result of script
Initial Private Key: 30568377312064202855
Gx: 79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
Gy: 483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
Computed Public Key: 0207beab99a58268db466d8683d47796046f567c2c25954a5ef8d90eeb32a8f770a
EC Point Coordinates:
X 07beab99a58268db466d8683d47796046f567c2c25954a5ef8d90eeb32a8f770a
Y 0bacda2871342a4d9f6615760d3bb7401fdd82df3b87a39cc86331388cac23379
real result
Public Key:
C 0230210c23b1a047bc9bdbb13448e67deddc108946de6de639bcc75d47c0216b1b
EC Point Coordinates:
X 30210c23b1a047bc9bdbb13448e67deddc108946de6de639bcc75d47c0216b1b
Y e383c4a8ed4fac77c0d2ad737d8499a362f483f8fe39d1e86aaed578a9455dfc
where did i go wrong ??
