密码学课设 中国剩余定理 Hust

题目

在这里插入图片描述

#include <stdio.h>
#include <gmp.h>
#include <iostream>   
#include<time.h>   
#include<stdlib.h>

#define MAX 1<<16

using namespace std;

void expmod(mpz_t e, mpz_t m, mpz_t N, mpz_t b)
{
    
    
    mpz_t i, r, result;
    mpz_init(i); mpz_init(r); mpz_init(result);
    mpz_set(i, e);
    mpz_set_ui(result, 1);
    while (mpz_cmp_ui(i, 1) != 0)
    {
    
    
        mpz_cdiv_r_ui(r, i, 2);
        if (mpz_cmp_ui(r, 0) == 0)
        {
    
    
            mpz_mul(m, m, m);
            mpz_cdiv_q_ui(i, i, 2);
        }
        else
        {
    
    
            mpz_mul(result, result, m);
            mpz_sub_ui(i, i, 1);
        }
        mpz_mod(m, m, N);
        mpz_mod(result, result, N);
    }
    mpz_mul(b, m, result);
    mpz_mod(b, b, N);
}

int main()
{
    
    
    //问题的个数
    int n;
    cin >> n;
    //存储大整数
    char temp[MAX];
    mpz_t e, p, q;
    mpz_init(e);
    mpz_init(p);
    mpz_init(q);
    scanf("%s", temp);
    mpz_set_str(p, temp, 10);
    scanf("%s", temp);
    mpz_set_str(q, temp, 10);
    scanf("%s", temp);
    mpz_set_str(e, temp, 10);

    for (int i = 0; i < n; i++)
    {
    
    
        mpz_t c, result;
        mpz_init(c);
        mpz_init(result);
        scanf("%s", temp);
        mpz_set_str(c, temp, 10);

        mpz_t yN, N, d, p1, q1;
        mpz_init(yN);
        mpz_init(N);
        mpz_init(d);
        mpz_init(p1);
        mpz_init(q1);

        mpz_sub_ui(p1, p, 1);
        mpz_sub_ui(q1, q, 1);
        mpz_mul(yN, p1, q1);
        mpz_mul(N, p, q);

        mpz_invert(d, e, yN);

        expmod(d, c, N, result);
        gmp_printf("%Zd\n", result);
        
        mpz_clear(yN);
        mpz_clear(N);
        mpz_clear(d);
        mpz_clear(p1);
        mpz_clear(q1);
        mpz_clear(result);
    }
    mpz_clear(e);
    mpz_clear(p);
    mpz_clear(q);

}

猜你喜欢

转载自blog.csdn.net/qq_43434682/article/details/108658021