gmp大数库的msvc版,mpir,是gmp在win下的移植,应该是和gmp完全一样的吧,我才刚用,没感觉不同,安装方法很简单。在打开要用mpir的项目下,点击工具-》Nuget包管理器-》程序包管理器控制台。然后等待打开后,键入Find-Package gmp ,等待一会儿就会有输出,可能会有点久,不用挂梯子,然后可以看到有几个关于gmp的包,选择下载就好了,我是用的Install-Package mpir-vc140-x64,当然

弄好后你可能会出现各种符号未定义,那是因为没有链接到库,可以右击直接解决方案管理器里的资源文件,添加现有项,在你的工程目录下应该有一个packages文件夹,按照这个目录packages \ mpir-vc140-x64.2.7.2.1 \ lib,然后你会看到,mpir.lib,选择,然后确定就ok了。当然更简单的解决方案是,在项目属性里,链接器-》输入-》附加依赖项,添加,写上,mpir.lib,保存,成功。

以下附上实现的RSA

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include<time.h>
void Fast_EX(mpz_t * in, mpz_t *e, mpz_t *N,mpz_t *end) {mpz_t a, b, c,result;mpz_init(a); mpz_init(b); mpz_init(c); mpz_init(result);mpz_set_ui(result, 1);mpz_set(a, *in); mpz_set(b, *e); mpz_set(c, *N);for (int i = b->_mp_size-1; i >= 0; i--) {unsigned long long ll = b->_mp_d[i]; for (int j = 0; j < 64; j++) {mpz_pow_ui(result, result, 2); mpz_mod(result, result, c);if ((ll>>(63-j))&0x01 == 1) {mpz_mul(result, result, a);mpz_mod(result, result, c);}}}mpz_set(*end, result);mpz_clear(a); mpz_clear(b); mpz_clear(c); mpz_clear(result);
}
void init_set(mpz_t in[],int number) {for (int i = 0; i < number; i++)mpz_init(in[i]);
}
void clear_set(mpz_t in[], int number) {for (int i = 0; i < number; i++)mpz_clear(in[i]);
}
void get_MI(mpz_t in[], mpz_t out[],int number) {mpz_t temp1, temp2; mpz_init(temp1); mpz_init(temp2);for (int i = 0; i < number; i++) {mpz_t sum; mpz_init(sum); mpz_set_ui(sum, 1);for (int j = 0; j < number; j++)if (j == i)continue;else mpz_mul(sum, sum, in[j]);mpz_gcdext(temp1, out[i], temp2, sum, in[i]);if (mpz_cmp_ui(out[i], 0) < 0)mpz_add(out[i], out[i], in[i]);mpz_mul(out[i], out[i], sum); //gmp_printf("%Zd,%Zd\n", out[i],sum);mpz_clear(sum);//gmp_printf("%Zd\n", out[i]);}mpz_clear(temp1);mpz_clear(temp2);
}
void get_prime(mpz_t in[], int number) {mpz_t min; mpz_init(min);int minbitlen = 512;mpz_set_ui(min, 2);mpz_pow_ui(min, min, minbitlen);srand(time(NULL));for (int i = 0; i < number; i++) {int len = rand()%20+1;while (len--)mpz_nextprime(min, min);mpz_set(in[i], min);}mpz_clear(min);
}
void get_edn(mpz_t in[], mpz_t *N, mpz_t *faiN, mpz_t *d, mpz_t *e,int number) {mpz_set_ui(*N, 1); mpz_set_ui(*faiN, 1);mpz_t temp[2]; init_set(temp, 2);for (int i = 0; i < number; i++) {mpz_mul(*N, *N, in[i]);mpz_sub_ui(temp[0], in[i], 1);mpz_mul(*faiN, *faiN, temp[0]);}mpz_set_ui(*e, 3);for (int i = 0; i < 100; i++) {mpz_gcdext(temp[0], *d, temp[1], *e, *faiN);if (mpz_cmp_ui(temp[0], 1) == 0) {if (mpz_cmp_ui(*d, 0) < 0)mpz_add(*d, *d, *faiN);break;}mpz_nextprime(*e, *e);}clear_set(temp,2);
}
void get_si(mpz_t in[], mpz_t *d,mpz_t out[], int number) {mpz_t temp; mpz_init(temp);for (int i = 0; i < number; i++) {mpz_sub_ui(temp, in[i], 1);mpz_mod(out[i], *d, temp);if (mpz_cmp_ui(out[i], 0) < 0)mpz_add(out[i],out[i], temp);}
}
void get_bi(mpz_t in[], mpz_t *M, mpz_t N[], mpz_t out[], int number) {for (int i = 0; i < number; i++) {Fast_EX(M, &(in[i]), &(N[i]), &(out[i]));}
}
void get_C(mpz_t MI[], mpz_t B[], mpz_t *C,mpz_t *N,int number) {mpz_set_ui(*C, 0);mpz_t temp; mpz_init(temp);for (int i = 0; i < number; i++) {mpz_mul(temp, MI[i], B[i]);mpz_add(*C, *C, temp);mpz_mod(*C, *C, *N);}
}
#define Len 5
int main(int argc, char **argv) {mpz_t prime_list[Len];init_set(prime_list, Len);get_prime(prime_list, Len);mpz_t N, faiN, d, e;mpz_init(N); mpz_init(faiN); mpz_init(d); mpz_init(e);get_edn(prime_list, &N, &faiN, &d, &e, Len);for (int i = 0; i < Len; i++) {gmp_printf("\tp%d=%Zd\n", i, prime_list[i]);}gmp_printf("\tN=%Zd\n", N);gmp_printf("\tfaiN=%Zd\n", faiN);gmp_printf("\tpublic key e=%Zd\n", e);gmp_printf("\tpaivate key d=%Zd\n", d);mpz_t MI[Len]; init_set(MI, Len);get_MI(prime_list, MI, Len);mpz_t S[Len]; init_set(S, Len);get_si(prime_list, &d, S, Len);mpz_t B[Len]; init_set(B, Len);mpz_t in, out; mpz_init(in); mpz_init(out);srand(time(NULL));clock_t T1 = 0, T2 = 0;int l = 100;while(l--){char buf[50];for (int i = 0; i < 49; i++) {buf[i] = 48 + rand() % 10;}buf[49] = '\0';mpz_set_str(in, buf, 10);gmp_printf("\tin:%Zd\n", in);Fast_EX(&in, &e, &N, &in);gmp_printf("\tM:%Zd\n", in);clock_t start1 = clock();Fast_EX(&in, &d, &N, &out); T1 += clock() - start1;gmp_printf("\ttime=%llu,out1:%Zd\n", clock() - start1, out);clock_t start2 = clock();get_bi(S, &in, prime_list, B, Len);get_C(MI, B, &out, &N, Len); T2 += clock() - start2;gmp_printf("\ttime=%llu,out2:%Zd\n", clock() - start2, out);
}printf("T1=%llu,T2=%llu,T1/T2=%d\n", T1, T2, T1*1.0 / T2*1.0);mpz_clear(in); mpz_clear(out); mpz_clear(N); mpz_clear(faiN); mpz_clear(d); mpz_clear(e);clear_set(prime_list, Len);clear_set(MI, Len);clear_set(S, Len);clear_set(B, Len);return 0;
}

vs2017装gmp大数库写的RSA实现以及用中国剩余定理加速相关推荐

  1. Win10 + VSCode C++配置gmp大数库(亲测可用)

    安装gmp静态库 需要用到 msys1.0.18 :msys1.0.18 download | SourceForge.net gmp6.2.1(下载tar.xz后缀):The GNU MP Bign ...

  2. 信息安全基础综合实验之Fermat素性检验算法(通过调用miracl大数库来实现)

    信息安全基础综合实验总共包含有二大块的内容,分为小组作业(小组作业有四项任务,为Fermat素性检验算法.中国剩余定理.密钥分配以及SM3的实现)和个人作业(SM2加密算法的实现),我也会分别通过五篇 ...

  3. vs2017编译libass静态库,并添加到ffmpeg中去,以支持ass,subtitles滤镜

    本人写过ffmpeg为mkv封装格式的音视频文件添加内挂字幕 ,里面字幕和视频是两个独立的通道,可以将字幕从文件中剔除,添加自己的字幕. 若想字幕和视频粘在一块,无法分割,则需要ass,subtitl ...

  4. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  5. python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  6. 运用selenium库写淘宝抢购详解【3】(文末附带源码)

    #每日一更[3] 今天讲的是用selenium库写一个淘宝抢购程序,10.19亲测可用 1.淘宝抢购的思路和上一篇的思路类似,通过打开浏览器筛选浏览器内的标签,并点击来实现自动化 #下面来想一下思路 ...

  7. 2021年压力容器作业(R)移动式压力容器充装(R2)考试题库解析

    题库来源:特种作业模考题库小程序 2021年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析是结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的 ...

  8. VS2017下安装fltk库——C++程序设计原理与实践图形编程指南

    VS2017下安装fltk库--C++程序设计原理与实践图形编程指南 前言 最近,我在学习<C++程序设计原理与实践>(原书第一版)遇到了安装图形库的问题,我花了两天时间,通过各种途径查找 ...

  9. 2021年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析

    题库来源:特种作业模考题库小程序 2021年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析是结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的 ...

最新文章

  1. 【转】java接口的性能测试
  2. 【Linux】一步一步学Linux——sleep命令(242)
  3. 真心酸,程序员工作了十年,衣服和电脑包破了都没钱买新的
  4. 「权威发布」2019年大学生电子设计竞赛获奖名单
  5. java线程——信号量(Semaphore)+障栅(CyclicBarrier)
  6. 站长工具--IP地址库
  7. php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
  8. Java 的布局管理器GridBagLayout的使用方法【图文说明】
  9. java来构造邻接矩阵
  10. 三星S10国行版发布 竟比国际版便宜?折叠屏手机也同期亮相
  11. Emacs代码折叠/显示
  12. [Java集合源码阅读]-ArrayList扩容机制
  13. 烟台移动dns网关_各地移动dns列表
  14. u盘安装linux戴尔boot设置,戴尔笔记本电脑怎么设置u盘启动|dell新机型bios设置usb启动步骤...
  15. 实战sqlmap绕过WAF(中转注入)
  16. java输出pdf(pdfptable和pdftcell)
  17. 社会生活中十大著名法则
  18. 什么是App分发?有哪些分发平台可以选择?
  19. LJN数理化生信奥队自传
  20. 请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某

热门文章

  1. 履带机器人-项目申报书(校创)
  2. 请教ASP.NET培训应该培训的内容和以及顺序
  3. 立创开源 | 电磁铁——切极电路
  4. 哈理工 oj——神奇的进制转换
  5. 苹果系列机型专业刷机,解锁,解ID
  6. Maven学习(一) -- 安装Maven及Eclipse中配置Maven(转自--江湖小妞)
  7. selenium三种等待时间之隐式等待
  8. 华硕B85M-E BIOS NVME m.2 mmtool4.5 硬盘提速25倍
  9. 王伟storm_美国911事件后中国网民的反应(实录)
  10. An基本工具介绍之选择线条工具(包教会)