void shamir() { llong m = 1234; // message std::default_random_engine gen; std::uniform_int_distribution<llong> random(100, 50'000); llong p = get_prime_number(1, 30'000); llong Ca, Da; while (true) { llong gcd{0}, x{0}, y{0}; Ca = get_prime_number(1, 30'000); generalized_euclid(Ca, p - 1, gcd, x, y); if (gcd == 1) { break; } } // reuse llong gcd{0}, x{0}, y{0}; generalized_euclid(Ca, p - 1, gcd, x, y); if (x < 0) { Da = p - 1 + x; } else { Da = x; } llong Cb, Db; while (true) { llong gcd{0}, x{0}, y{0}; Cb = get_prime_number(1, 30'000); generalized_euclid(Cb, p - 1, gcd, x, y); if (gcd == 1) { break; } } generalized_euclid(Cb, p - 1, gcd, x, y); if (x < 0) { Db = p - 1 + x; } else { Db = x; } llong x1, x2, x3, x4; x1 = pow_module(m, Ca, p); x2 = pow_module(x1, Cb, p); x3 = pow_module(x2, Da, p); x4 = pow_module(x3, Db, p); std::cout << "x1 = " << x1 << std::endl; std::cout << "x2 = " << x2 << std::endl; std::cout << "x3 = " << x3 << std::endl; std::cout << "x4 = " << x4 << std::endl; std::cout << "m = " << m << std::endl; }
//TODO: Impement RSA void RSA() { llong p = get_prime_number(1, 30'000); llong q = get_prime_number(1, 30'000); llong n = p * q; llong fi = (p - 1) * (q - 1); // Get c and d llong d{0}; llong gcd{0}, x{0}, y{0}, c{0}; while (true) { d = get_prime_number(1, fi -1); generalized_euclid(d, fi, gcd, x, y); if (gcd == 1) { break; } } generalized_euclid(d, fi, gcd, x, y); if (x < 0) { c = fi + x; } else { c = x; } // Open file w/ message std::ifstream msg("example", std::ios::binary | std::ios::in); if (!msg.is_open()) { std::cerr << "File not found" << std::endl; } llong m{0}, e{0}; // Encode std::ofstream encode_out("rsa_encode", std::ios::binary | std::ios::out); while (msg.read((char*)&m, sizeof(char))) { e = pow_module(m, d, n); encode_out.write((char*)&e, sizeof(llong)); } msg.close(); encode_out.close(); // Decode std::ifstream encode_in("rsa_encode", std::ios::binary | std::ios::in); std::ofstream decode_out("rsa_decode", std::ios::binary | std::ios::out); while (encode_in.read((char*)&e, sizeof(llong))) { m = pow_module(e, c, n); decode_out.write((char*)&m, sizeof(char)); } encode_in.close(); decode_out.close(); }
void test_mprime(void) { int i, k, m, t; unsigned int *n; logout("test mprime\n"); m = mtotal; k = 0; for (i = 0; i < 10000; i++) { n = mint(i); t = mprime(n); mfree(n); //if (i == primetab[k]) { if (i == get_prime_number(k)) { if (t == 0) { sprintf(logbuf, "failed for prime number %d\n", i); logout(logbuf); errout(); } k++; } else if (t == 1) { sprintf(logbuf, "failed for composite number %d\n", i); logout(logbuf); errout(); } } if (m != mtotal) { logout("memory leak\n"); errout(); } logout("ok\n"); }