From a5cbb82dd9e3a1057ae14cd97048a62189b8cede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= Date: Sun, 12 Apr 2026 09:43:43 +0200 Subject: [PATCH] it works finally --- helper.c | 2 + main | Bin 0 -> 27416 bytes main.c | 121 ++++++++++++++++++++++++++++++++++--------------------- 3 files changed, 76 insertions(+), 47 deletions(-) create mode 100755 main diff --git a/helper.c b/helper.c index 83bdafc..deff16c 100644 --- a/helper.c +++ b/helper.c @@ -2,6 +2,8 @@ #include #include +uint32_t rand32() { return (rand() << 16) | (rand() & 0xFFFF); } + void print_uint128(unsigned __int128 n) { if (n == 0) { printf("0\n"); diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..9d8503bb1a7edd1ae5fc5c7627a84c80d53662b5 GIT binary patch literal 27416 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 W>J_E57r(sxQyT=w#uR}RRQo@?^ZGde literal 0 HcmV?d00001 diff --git a/main.c b/main.c index c03bb15..4208e95 100644 --- a/main.c +++ b/main.c @@ -24,8 +24,8 @@ uint64_t *dec_to_bin(uint64_t d, uint64_t *length) { return binary_form; } -unsigned __int128 quick_pow(uint64_t *d_binary, unsigned __int128 a, unsigned __int128 n, uint64_t length) { - unsigned __int128 *powed = calloc(100, sizeof(unsigned __int128)); +uint64_t quick_pow(uint64_t *d_binary, uint64_t a, uint64_t n, uint64_t length) { + uint64_t *powed = calloc(100, sizeof(uint64_t)); powed[0] = a; for (int i = 1; i <= length; i++) { @@ -59,6 +59,17 @@ bool prime_test(uint64_t n, int a) { // S: see above // r = {0,... S-1} + // this should not happen but just in case + if (n <= 1) { + return false; + } + if (n == 2) { + return true; + } + if (n % 2 == 0) { + return false; + } + uint64_t d = n - 1; uint64_t S = 0; @@ -98,7 +109,7 @@ bool prime_test(uint64_t n, int a) { typedef struct { int base; - uint64_t prime; + uint32_t prime; } prime_test_t; void *prime_thread_worker(void *arg) { @@ -120,7 +131,7 @@ typedef struct { __int128 y; } euklidian_result_t; -euklidian_result_t euklidian_algorigthm_extended(unsigned __int128 a, unsigned __int128 b) { +euklidian_result_t euklidian_algorigthm_extended(uint64_t a, uint64_t b) { __int128 r = a % b, q = a / b, k = 1, xk = 0, yk = 1, next_r; __int128 prev_r = b, prev_q, prev_xk = 0, prev_yk = 1, prev_prev_xk = 1, prev_prev_yk = 0; euklidian_result_t res = {0, 0, 0}; @@ -147,17 +158,17 @@ euklidian_result_t euklidian_algorigthm_extended(unsigned __int128 a, unsigned _ __int128 x = k % 2 == 0 ? prev_xk : -prev_xk; __int128 y = k % 2 == 0 ? -prev_yk : prev_yk; - res.lnko = prev_r; + res.lnko = (uint64_t)prev_r; res.x = x; res.y = y; return res; } -unsigned __int128 kinai_maradek_tetel(uint64_t *m, unsigned __int128 d, prime_test_t *p, prime_test_t *q) { +uint64_t kinai_maradek_tetel(uint64_t *m, uint64_t d, prime_test_t *p, prime_test_t *q) { // sum(i: 1,2): Ci * Yi * Mi mod M // M: P*Q, Mp: M/P, Mq: M/Q - unsigned __int128 M = p->prime * q->prime; + uint64_t M = (uint64_t)p->prime * q->prime; uint64_t Mp = q->prime; uint64_t Mq = p->prime; @@ -165,66 +176,79 @@ unsigned __int128 kinai_maradek_tetel(uint64_t *m, unsigned __int128 d, prime_te uint64_t temp_exponent = d % (p->prime - 1); uint64_t exponent_bin_length = 0; uint64_t *exponent_as_binary = dec_to_bin(temp_exponent, &exponent_bin_length); - unsigned __int128 c1 = quick_pow(exponent_as_binary, *m, p->prime, exponent_bin_length); + uint64_t c1 = quick_pow(exponent_as_binary, *m, p->prime, exponent_bin_length); free(exponent_as_binary); // C2: c^(d mod Q-1) mod Q temp_exponent = d % (q->prime - 1); exponent_as_binary = dec_to_bin(temp_exponent, &exponent_bin_length); - unsigned __int128 c2 = quick_pow(exponent_as_binary, *m, q->prime, exponent_bin_length); + uint64_t c2 = quick_pow(exponent_as_binary, *m, q->prime, exponent_bin_length); free(exponent_as_binary); euklidian_result_t y = euklidian_algorigthm_extended(Mp, Mq); // in the struct the x will mean the y1 and y will mean the y2 // if either of them is less a negative number shift them into postive range with with hte modulo - y.x %= p->prime; - if (y.x < 0) - y.x += p->prime; + // y.x %= p->prime; + // if (y.x < 0) + // y.x += p->prime; + // + // y.y %= q->prime; + // if (y.y < 0) + // y.y += q->prime; + // + // unsigned __int128 s1 = (c1 * y.x * Mp) % M; + // unsigned __int128 s2 = (c2 * y.y * Mq) % M; + // return (s1 + s2) % M; + uint64_t y1_pos; + if (y.x < 0) { + y1_pos = p->prime - (uint64_t)(-y.x % p->prime); + } else { + y1_pos = (uint64_t)y.x % p->prime; + } - y.y %= q->prime; - if (y.y < 0) - y.y += q->prime; + uint64_t y2_pos; + if (y.y < 0) { + y2_pos = q->prime - (uint64_t)(-y.y % q->prime); + } else { + y2_pos = (uint64_t)y.y % q->prime; + } - unsigned __int128 s1 = (c1 * y.x * Mp) % M; - unsigned __int128 s2 = (c2 * y.y * Mq) % M; - return (s1 + s2) % M; + // Apply the modulo between multiplications to prevent 192-bit overflows! + uint64_t s1 = (uint64_t)((((unsigned __int128)c1 * y1_pos) % M * Mp) % M); + uint64_t s2 = (uint64_t)((((unsigned __int128)c2 * y2_pos) % M * Mq) % M); + return (uint64_t)(((unsigned __int128)s1 + s2) % M); } -unsigned __int128 rsa_encrypt(uint64_t *m, prime_test_t *p, prime_test_t *q, uint64_t *out_e, unsigned __int128 *out_d) { - unsigned __int128 n = (unsigned __int128)p->prime * q->prime; - printf("n: "); - print_uint128(n); - printf("\n"); +uint64_t rsa_encrypt(uint64_t *m, prime_test_t *p, prime_test_t *q, uint64_t *out_e, uint64_t *out_d) { + uint64_t n = (uint64_t)p->prime * q->prime; + printf("n: %ju\n", n); - unsigned __int128 fi_n = (unsigned __int128)(p->prime - 1) * (q->prime - 1); - printf("fi_n: "); - print_uint128(fi_n); - printf("\n"); + uint64_t fi_n = (uint64_t)(p->prime - 1) * (q->prime - 1); + printf("n: %ju\n", fi_n); // 2. kulcsgeneralas - uint64_t e = 0; - do { - e = rand64() % fi_n; - } while (e <= 1 && prime_test(e, p->base)); // the p and q base is used everywhere anyways, i wont pass in another arg + uint64_t e = 65537; + // TODO: put this back after debug + // do { + // e = ran32() % fi_n; + // } while (e <= 1 || !prime_test(e, p->base)); // the p and q base is used everywhere anyways, i wont pass in another arg euklidian_result_t calc_d = euklidian_algorigthm_extended(fi_n, e); // if either of them is less a negative number shift them into postive range with with hte modulo - calc_d.x %= fi_n; - if (calc_d.x < 0) - calc_d.x += fi_n; + uint64_t d; + if (calc_d.y < 0) { + d = fi_n - (uint64_t)(-calc_d.y); + } else { + d = (uint64_t)calc_d.y; + } - calc_d.y %= fi_n; - if (calc_d.y < 0) - calc_d.y += fi_n; - - unsigned __int128 d = calc_d.y; *out_e = e; *out_d = d; uint64_t length = 0; uint64_t *nyenye = dec_to_bin(e, &length); - unsigned __int128 c = quick_pow(nyenye, *m, n, length); + uint64_t c = quick_pow(nyenye, *m, n, length); free(nyenye); printf("\nc: "); @@ -256,8 +280,13 @@ int main() { pthread_join(thread_q, NULL); printf("\n"); + p.prime = 3000000019; + q.prime = 4000000007; + printf("p: %u\n", p.prime); + printf("q: %u\n", q.prime); + uint64_t e = 0; - unsigned __int128 d = 0; + uint64_t d = 0; if (!isSignature) { // rsa encryption @@ -275,22 +304,20 @@ int main() { rsa_encrypt(&dummy, &p, &q, &e, &d); printf("\n"); - unsigned __int128 signature = kinai_maradek_tetel(&m, (uint64_t)d, &p, &q); + uint64_t signature = kinai_maradek_tetel(&m, d, &p, &q); printf("Alairas (Signature): "); print_uint128(signature); // key verifacation uint64_t e_length = 0; uint64_t *e_binary = dec_to_bin(e, &e_length); - unsigned __int128 n = p.prime * q.prime; + uint64_t n = (uint64_t)p.prime * q.prime; - unsigned __int128 verified_message = quick_pow(e_binary, (uint64_t)signature, n, e_length); + uint64_t verified_message = quick_pow(e_binary, signature, n, e_length); free(e_binary); - printf("Verified Message: "); - print_uint128(verified_message); + printf("Verified Message: %ju", verified_message); - // 4. THE RESULT if (verified_message == m) { printf("\nSignature correct\n"); } else {