Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
nomachine
on 12/01/2024, 14:42:59 UTC
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.

Code:
#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 ??  Grin