xd信息安全数学基础密码学实验-1 femat素性检测算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、基础知识原理

基础知识不用多说了,上课老师都讲了,也有相关的ppt,这里就不多说了。
其中用到了同余相关的概念。
Fermat小定理

相关的算法步骤看下图所示:
在这里插入图片描述
这是我自己画的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
	3cinnum(m,fp);//从文件中读取一个数
	4bigrand(x,a);//生成随机数 
	//a<x=m-1
	5egcd(a,m,g);//求a和m的最大公约数 
	//g = (a,m)
	6powmod(a,x,m,r);//模幂运算,
	//r=ax (mod m)
	7cotnum(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
谢谢大家!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值