示例#1
0
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;
}
示例#2
0
//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();
}
示例#3
0
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");
}