#include<gmp.h>
#include<time.h>
#include<fstream>
#include<string.h>
#include <string>
#include<iostream>
#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
using namespace std;
//è¾å
¥å符串转æ¢
string strToNum(char str[]){
int len = strlen(str);
string num[len];
string returnstr = "";
for(int i = 0;i < len; i++){
if(str[i] == '0') num[i] = "00";
else if(str[i] == '1') num[i] = "01";
else if(str[i] == '2') num[i] = "02";
else if(str[i] == '3') num[i] = "03";
else if(str[i] == '4') num[i] = "04";
else if(str[i] == '5') num[i] = "05";
else if(str[i] == '6') num[i] = "06";
else if(str[i] == '7') num[i] = "07";
else if(str[i] == '8') num[i] = "08";
else if(str[i] == '9') num[i] = "09";
else if(str[i] == 'a') num[i] = "10";
else if(str[i] == 'b') num[i] = "11";
else if(str[i] == 'c') num[i] = "12";
else if(str[i] == 'd') num[i] = "13";
else if(str[i] == 'e') num[i] = "14";
else if(str[i] == 'f') num[i] = "15";
else if(str[i] == 'g') num[i] = "16";
else if(str[i] == 'h') num[i] = "17";
else if(str[i] == 'i') num[i] = "18";
else if(str[i] == 'j') num[i] = "19";
else if(str[i] == 'k') num[i] = "20";
else if(str[i] == 'l') num[i] = "21";
else if(str[i] == 'm') num[i] = "22";
else if(str[i] == 'n') num[i] = "23";
else if(str[i] == 'o') num[i] = "24";
else if(str[i] == 'p') num[i] = "25";
else if(str[i] == 'q') num[i] = "26";
else if(str[i] == 'r') num[i] = "27";
else if(str[i] == 's') num[i] = "28";
else if(str[i] == 't') num[i] = "29";
else if(str[i] == 'u') num[i] = "30";
else if(str[i] == 'v') num[i] = "31";
else if(str[i] == 'w') num[i] = "32";
else if(str[i] == 'x') num[i] = "33";
else if(str[i] == 'y') num[i] = "34";
else if(str[i] == 'z') num[i] = "35";
else if(str[i] == 'A') num[i] = "36";
else if(str[i] == 'B') num[i] = "37";
else if(str[i] == 'C') num[i] = "38";
else if(str[i] == 'D') num[i] = "39";
else if(str[i] == 'E') num[i] = "40";
else if(str[i] == 'F') num[i] = "41";
else if(str[i] == 'G') num[i] = "42";
else if(str[i] == 'H') num[i] = "43";
else if(str[i] == 'I') num[i] = "44";
else if(str[i] == 'J') num[i] = "45";
else if(str[i] == 'K') num[i] = "46";
else if(str[i] == 'L') num[i] = "47";
else if(str[i] == 'M') num[i] = "48";
else if(str[i] == 'N') num[i] = "49";
else if(str[i] == 'O') num[i] = "50";
else if(str[i] == 'P') num[i] = "51";
else if(str[i] == 'Q') num[i] = "52";
else if(str[i] == 'R') num[i] = "53";
else if(str[i] == 'S') num[i] = "54";
else if(str[i] == 'T') num[i] = "55";
else if(str[i] == 'U') num[i] = "56";
else if(str[i] == 'V') num[i] = "57";
else if(str[i] == 'W') num[i] = "58";
else if(str[i] == 'X') num[i] = "59";
else if(str[i] == 'Y') num[i] = "60";
else if(str[i] == 'Z') num[i] = "61";
returnstr.append(num[i]);
}
return returnstr;
}
int main(){
/*
* p q ï¼å¤§ç´ æ°
* n : p*q
* m : (p - 1)(q - 1)
* e : ððð(ð,m) = 1 ï¼åe为40297ï¼
* ðð â¡ 1 ððð m
* å
¬é¥ ðð¾ = {ð, ð}ï¼ç§é¥ ðð¾ = {ð, ð}
* M :ææ C_pubï¼å
¬é¥å å¯å¯æ C_pv: ç§é¥å å¯å¯æ
* M_pv: ç§é¥è§£å¯å¯æ M_pub: å
¬é¥è§£å¯å¯æ
*/
mpz_t p, q, n, m, e, d, M, C_pub, C_pv, M_pub, M_pv, r;
mpz_init(p);
mpz_init(q);
mpz_init(m);
mpz_init(n);
mpz_init_set_ui(e, 40297);
mpz_init(d);
mpz_init(M);
mpz_init(C_pub);
mpz_init(C_pv);
mpz_init(M_pub);
mpz_init(M_pv);
mpz_init_set_str(r,"340282366920938463463374607431768211456",10); //2^128
gmp_randstate_t grt;
gmp_randinit_default(grt);
gmp_randseed_ui(grt, time(NULL));
do{
mpz_urandomb(p, grt, 1024);//éæºçæä¸ä¸ª0-2^1024çä¸ä¸ªæ°
mpz_urandomb(q, grt, 1024);
}while(mpz_cmp(p,r)<0 || mpz_cmp(q,r)< 0); //ä¿è¯p q ä¸å°äº2^128
mpz_nextprime(p, p);//æ¾å°é»è¿çç´ æ°p
mpz_nextprime(q, q);//æ¾å°é»è¿çç´ æ°q
mpz_mul(n, p, q); //计ç®n=p*q
mpz_sub_ui(p, p, 1);//p-1
mpz_sub_ui(q, q, 1);//q-1
mpz_mul(m, p, q);//m = (p-1)(q-1)
mpz_invert(d, e, m);//计ç®d\
gmp_printf("%s %ZX\n\n", "p为:", p);
gmp_printf("%s %ZX\n\n", "q为:", q);
gmp_printf("%s %ZX\n\n", "n为:", n);
gmp_printf("%s %ZX\n\n", "ð(ð)为:", m);
gmp_printf("%s %ZX\n\n", "d为:", d);
gmp_printf("%s %ZX\n\n", "e为:", e);
char text[255] = "";
printf("请è¾å
¥ææ\n");
scanf("%[^\n]",&text);
string retext = strToNum(text);
// printf("%s \n",retext.c_str());
mpz_set_str(M, retext.c_str(), 10);
gmp_printf("%s %ZX\n\n", "ææM转æ¢åçåå
è¿å¶è¡¨ç¤ºä¸º:", M);
mpz_powm(C_pub, M, e, n); //计ç®å
¬é¥å å¯ C_pub=M^e mod n;
gmp_printf("%s %ZX\n\n", "å
¬é¥å å¯ç»æC_pub为:", C_pub);
mpz_powm(M_pv, C_pub, d, n); //计ç®ç§é¥è§£å¯ M_pv=C_pub^d mod n;
gmp_printf("%s %ZX\n\n","ç§é¥è§£å¯ç»æM_pv为", M_pv);
mpz_powm(C_pv, M, d, n); //计ç®ç§é¥å å¯ C_pv=M^d mod n;
gmp_printf("%s %ZX\n\n", "ç§é¥å å¯ç»æC_pv为:", C_pv);
mpz_powm(M_pub, C_pv, e, n); //计ç®å
¬é¥è§£å¯ M_pub=C_pv^e mod n;
gmp_printf("%s %ZX\n\n","å
¬é¥è§£å¯ç»æM_pub为", M_pub);
}