提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基础知识不用多说了,上课老师都讲了,也有相关的ppt,这里就不多说了。 其中用到了同余相关的概念。
相关的算法步骤看下图所示: 这是我自己画的visio流程图,和上图所描述的相同
使用的是vc 6++ 和miracl大整数库。 miracl整数库的配置可以自行去百度一下,应该也有不少。我这里提供一下miracl整数库的配置资源吧。见链接: 如果在配置的时候有什么问题可以私信或者评论,我会尽力而为的。 链接:http@@s://p@@an.baidu.c@@om/s/1HKP-v0OFQIPyZmMjRSPFJw 提取码:jops (把@删除掉就是完整链接)
此部分主要列举了一些用到的函数,因为是大整数,所以对于一般的“=”赋值或者“*”乘法都无法实现,需要用函数实现。
1、 miracl *mip = mirsys(10000,10); //初始化10的五次方 mip->IOBASE = 10; //设置 10进制 2、 x = mirvar(0); //初始化 //给x赋值大整数0 3、 cinnum(m,fp);//从文件中读取一个数 4、 bigrand(x,a);//生成随机数 //a<x=m-1 5、 egcd(a,m,g);//求a和m的最大公约数 //g = (a,m) 6、 powmod(a,x,m,r);//模幂运算, //r=ax (mod m) 7、 cotnum(m,stdout)//把大整数m打印到终端这里就不多说什么了,算法很简单,只需要一个for循环即可实现。 代码中也有注释,不懂的可以私信我。 代码如下:
#include<stdio.h> #include"miracl.h" /*void gov(int n){ int i = 0; float a = 0.5; float res =1.0; for(i=0;i<n;i++){ res = a * res; } res = 1.0 - res; printf("当k为%d时的概率为%f",n,res); }*/ int main (){ FILE *fp; int i; int res = 0; int k = 4;// 按照课件的k安全参数设置4 big m; big a,g,r; big x,y; //定义大整数变量 miracl *mip = mirsys(10000,10); //初始化10的五次方 mip->IOBASE = 10; //设置 10进制 m = mirvar(0); a = mirvar(0); g = mirvar(0); r = mirvar(0); x = mirvar(0); //初始化 y = mirvar(1); //定义y=1 用于比较 fp = fopen("11.txt","r"); if(fp==NULL){ printf("Error!"); } cinnum(m,fp);//m是数 fclose(fp); decr(m,1,x);//x=m-1 for(i=0;i<k;i++){ bigrand(x,a);//随机数 a<x=m-1 egcd(a,m,g);//求a和m的最大公约数 g = (a,m) if(!compare(g,y)){ powmod(a,x,m,r);//模幂运算,r=ax mod m if(!compare(r,y)){ if(i==k-1){ cotnum(m,stdout);//输出 printf("可能是一个素数,概率为93.75%"); } } else { printf("是一个合数"); break; } } else { printf("是一个合数"); break; } } mirkill(a); //释放内存 mirkill(g); mirkill(r); mirkill(m); mirkill(x); mirkill(y); mirexit(); //清除MIRACL系统,释放所有的内部变量 getchar(); return 0; }这个是此课程的第一个实验,挺简单的,主要目的就是熟悉miracl这个大整数库。 最新补充: 剩下的三个实验的博客都已完成,请狂点链接。 中国剩余定理 https://blog.csdn.net/Koz_0/article/details/109187205 基于中国剩余定理的秘密共享方案 https://blog.csdn.net/Koz_0/article/details/109672750 ElGamal公钥密码算法 https://blog.csdn.net/Koz_0/article/details/109910217 谢谢大家!