提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、基础知识原理
基础知识不用多说了,上课老师都讲了,也有相关的ppt,这里就不多说了。
其中用到了同余相关的概念。
相关的算法步骤看下图所示:
这是我自己画的visio流程图,和上图所描述的相同
二、算法实现
1.环境
使用的是vc 6++ 和miracl大整数库。
miracl整数库的配置可以自行去百度一下,应该也有不少。我这里提供一下miracl整数库的配置资源吧。见链接:
如果在配置的时候有什么问题可以私信或者评论,我会尽力而为的。
链接:http@@s://p@@an.baidu.c@@om/s/1HKP-v0OFQIPyZmMjRSPFJw
提取码:jops (把@删除掉就是完整链接)
2.Miracl库函数说明
此部分主要列举了一些用到的函数,因为是大整数,所以对于一般的“=”赋值或者“*”乘法都无法实现,需要用函数实现。
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打印到终端
3.主要代码
这里就不多说什么了,算法很简单,只需要一个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
谢谢大家!