我是编程新手,我有一个编码作业。我们必须使用 MPIR 来实现 RSA。我以我能想到的最佳方式生成了 p 和 q。我无法将它们设为 512 位,但我会继续保持原样。我还没有测试素数。如果我有时间,我会处理字节大小和素数测试。
我的问题是关于找到 Phi(n) = (p-1)*(q-1)。我设法找到 p、q 和 N,但 Phi(n) 和 N 给出了相同的结果。如您所见,我多次检查了 MPIR 文档中的函数,并尝试了两个类似的减法函数,但仍然没有运气。(我没有在这里写 q 的代码,因为它是 p 的重复。)
有人可以指导我吗?我想提前说声谢谢。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <mpir.h>
#include <cstdlib>
#include <iostream>
using std::cout;
using std::cin;
int main()
{
mpz_t p;
mpz_init(p);
mpz_t randint;
mpz_init(randint);
gmp_randstate_t state;
gmp_randinit_mt(state);
mpir_ui seed;
cout << "Please choose a number for the seed of the random number
generator:";
cin >> seed;
gmp_randseed_ui(state, seed);
mpz_urandomb(randint, state, 512);
mpz_t limit;
mpz_init(limit);
mpz_t winner;
mpz_init(winner);
mpz_ui_pow_ui(limit, 2, 511);
mpz_ior(winner, limit, randint);
mpz_next_prime_candidate(p, winner, state);
gmp_randclear(state);
mpz_clear(randint);
mpz_clear(winner);
mpz_t q;
mpz_init(q);
mpz_init(randint);
gmp_randinit_mt(state);
cout << "Please choose a number for the seed for the random number
generator :";
cin >> seed;
gmp_randseed_ui(state, seed);
mpz_urandomb(randint, state, 512);
mpz_init(limit);
mpz_init(winner);
mpz_ui_pow_ui(limit, 2, 511);
mpz_ior(winner, limit, randint);
mpz_next_prime_candidate(q, winner, state);
gmp_randclear(state);
mpz_clear(randint);
mpz_clear(limit);
mpz_clear(winner);
// Now we find n=p*q
mpz_t N;
mpz_init(N);
mpz_mul(N, p, q);
mpz_t phin;
mpz_init(phin);
mpz_t pa;
mpz_init(pa);
mpz_t qa;
mpz_init(qa);
第一种方式
mpz_t one;
mpz_init(one);
mpz_set_ui(one, 1);
mpz_sub(pa, p, one);
mpz_sub(qa, q, one);
mpz_mul(phin, pa, qa);
第二种方式
mpz_sub_ui(pa, p, 1);
mpz_sub_ui(qa, q, 1);
mpz_mul(phin, pa, qa);
然后我将它们写入文档并清除所有内容。