用gmp库实现rsa加密算法

2019-04-14 08:48发布

算法简介: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 ", key_p); gmp_printf("%ZX ", 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) ", "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) ", "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 ", "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 ","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。