用gmp库实现rsa加密算法

算法简介:https://blog.csdn.net/dbs1215/article/details/48953589

参考文章:https://blog.csdn.net/qmickecs/article/details/39676655

算法主要用到的gmp函数

mpz_urandomb(number,grt,1024) //随机生成一个0-2^1024的一个数

mpz_nextprime(prime_number,number) //使用GMP自带的素数生成函数

mpz_mul(mpz_t op,mpz_t op1,mpz_op2) //大数乘法 op=op1*op2

mpz_sub_ui(mpz_t op,mpz_op2,1) //大数减法 op=op2-1;

mpz_invert(op1,op2,op3) //求逆元函数,即数论倒数 op1*op2 mod op3=1;

mpz_powm(op1,op2,op3,op4) //求幂模函数 即op1=op2^op3  mod op4;

算法分为这几步骤:1) 先用素数生成函数,生成两个大素数p和q

                                2) 计算n=p*q, f=(p-1)*(q-1)

                                3) 取e的值,一般取65537

                                4)计算d的值,ed=1 mod n;

                                5) 加密 C=M^e mod n

                                6) 解密M'=C^d mod n

算法代码:

#include
#include
#include
#include
#include
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	//生成大素数算法
	gmp_randstate_t grt;
	gmp_randinit_default(grt); //设置随机数生成算法为默认
	gmp_randseed_ui(grt, time(NULL)); //设置随机化种子为当前时间

	mpz_t key_p, key_q;
	mpz_init(key_p); //初始化q和p大素数
	mpz_init(key_q);

	mpz_urandomb(key_p, grt, 1024);//随机生成一个0-2^1024的一个数
	mpz_urandomb(key_q, grt, 1024);



	//mpz_t key_pp, key_qq;
	mpz_nextprime(key_p, key_p);  //使用GMP自带的素数生成函数
	mpz_nextprime(key_q, key_q);
	gmp_printf("%ZX\n\n", key_p);
	gmp_printf("%ZX\n\n", key_q);

	//计算p*q的值,并存放在n中
	mpz_t key_n;
	mpz_init(key_n);
	mpz_mul(key_n, key_p, key_q); //计算p*q

	//计算(p-1)*(q-1)并将值放在key_f 中
	mpz_t key_f;
	mpz_init(key_f);
	mpz_sub_ui(key_p, key_p, 1);
	mpz_sub_ui(key_q, key_q, 1);
	mpz_mul(key_f, key_p, key_q);

	//找出符合要求的e,即公钥为(e,n) e通常取3,17和65537三个值,我们直接取e=65537
	mpz_t key_e;
	mpz_init_set_ui(key_e, 65537);

	//输出公钥(e,n)
	gmp_printf("%s (%ZX, %ZX)\n\n\n", "public key is:", key_n, key_e);

	//求e的逆元,即ed mod (f)=1;
	//用gmp自带的求数论逆元函数对其进行求解
	mpz_t key_d;
	mpz_init(key_d);
	mpz_invert(key_d, key_e, key_f);
	gmp_printf("%s (%ZX, %ZX)\n\n\n", "private key is:", key_d, key_e); //输出私钥


	//将明文m进行加密 C=m^e mod n
	mpz_t M, C;
	mpz_init(C);
	mpz_init_set_ui(M, 1234);
	//mpz_get_str(M, 16, M);
	mpz_powm(C, M, key_e, key_n);  //使用GMP中的模幂计算函数 C=M^e mod n;
	gmp_printf("%s %ZX\n\n", "the cipertxt is", C);

	//解密函数算法 M=C^d mod n
	mpz_t M2;
	//mpz_init_set_str(C2,M2,16);
	mpz_init(M2);
	mpz_powm(M2, C, key_d, key_n);   //使用GMP中的模幂计算函数 M=C^d mod n;
	gmp_printf("%s %ZX\n\n","the M2 is", M2);

	mpz_clear(key_q);
	mpz_clear(key_p);
	mpz_clear(M);
	mpz_clear(C);
	mpz_clear(M2);
	mpz_clear(key_n);
	mpz_clear(key_f);
	mpz_clear(key_d);
	return 0;
}

运算结果

A75752A2608271F3D462F2653BF934E71B66D14F31FAB99B17CC40B8CB6DD9F583D9D0CD50A0BB63B22C96252B68812255728453FCFD87BCB0AD5B3954C2D9569AC17701

634D66DFF615277C68CB1FE7E60F051316B49577E6D0466B1449A2333AC642EB86408A5C6B0995D6ACFBD063A80BFD41EE38805BBCDC2E547083A94C11074BAC4C496D0969BCDB9BE9929B391DA94482F334320345B948C7B846718423937B778484477B74F86E62D732024C209265A4C0E2D3D84D3DC634F9CF12F1FF2DB767

public key is: (D9DA45BB82CB8C8C54223423D2D59477FB04613E3A5D58D851E5CA3794B6165480480C1FFE5405C51BB104539CD3BE8AF302ED2078184A83C360C9FB7BAF2B3911676E97F1FF2703C9D0BD4AFD2755E64D44EEABDACD6D39F7391AAAC2495D87BE1487CEFC4D5E6D3502A833332C42F8E8D0A42F5D0BADC51277739B5DFAF6A266D53B1754EB1186A08041549070DA2E42D044EBB404EE2D788A2AD23399F1426C92DED43B5A4CC24BD51B8903D05B1C332C35C03A42AB8F5DB92C32343063B4E79586EBFBB256EBEA78D6DA7C691C7E8D699F9DEFDA0BA24F0F11217010500C4B411C73EE73B5FCDB25ABDCA849AB079ABA175584F9F3259705DF57A159867, 10001)


private key is: (8681CE2C48458531DF807ED0DF8C1F6F34FD2F4D4C9BF60F1A01D7291A189310F9638298FE5EC27140F7BAC4254057955315AB7330B34ECEAC0346B28F5B4844A40A48AE682C31DA94F0DCEF3FFED97AA89AB70244C6317A68BA494CC548A706F8C59454A852DCCA70C08339998EEA8AE4B46DAB10B7F5428874585CC559FE887752B872EAE24EB8A96D2E13E50C473D105F944736E2BB37DEEAA826F56D552B08B596EC2F1F9F1F23995F9942CAC6D675C12163CEF81C6635728FDCF41D728B36A78612CB4CCF64E62622F3CFC4EED1F3098E6C6B96F1D95FFEBFE8265A2D9E6BF5D64CFC68A36129F55C1155B01B16FB1C22313AC983A42BBB55417D1A001, 10001)


the cipertxt is 956BE5472CCD11225BED957E0C8FFCD3961B330CB27E3646485E710371E270E5ECF0DC022733FDB8C6E7B80F513E1DCF52DA9A1DA306FC460D8B0BAEACCD3EA575383DFEEE7BA1148AC3EA4B0B3A28A003D29709C86FFBE585986476239D80962AFC7D3748B6365C6E20E7915E8F71B65B749355317CAA254111257BFE2056BD19AC515C28E56C02068F220630EE1ED7B897B7FE5B638BFB23F9BC93380C82CB1D08BD47F160C47D35576BA827BF634808731FE5399906DF9AD4961F3E147FC0346553C41B49C3909F311626548B423BAADF36F614066107673CB5D7BCF284807B5C571D67AB0FD42720D8966ED5847DC04714461F49A8A0F2960D5E7C5AEEC

the M2 is 4D2

 

 

加密明文是1234 化为16进制就是4D2。

 

你可能感兴趣的:(gmp)