c语言编fermat素数检验,记信安实验(一):Fermat 素性检验算法

前言:在密码学中很多地方都需要素数,很多库直接提供检验是否是素数的函数,该文章通过Fermat 素性检验算法实现素数检验(C语言)。

一、实验内容

给定奇整数m大于等于3和安全参数k,判断m是否为合数,或者有(1-1/2^k)概率为素数。

二、实验环境

(1). Windows7

(2). VC ++ 6.0

(3). Miracl_5.5.4

三、实验原理:

1.Fermat 小定理:给定素数p,a∈Z,则有a^(p-1)≡1(mod p);

2.奇整数m,若任取一整数2≤a≤m-2,(a,m)= 1,使得 a^(m-1)=1 (mod m),则m至少有1/2的概率为素数。

四、实验涉及的相关函数

1. mirsys()

函数原型:miracl*mirsys(int nd,int nb)

功能说明:初始化MIRACL系统

2. mirvar()

函数原型:flash mirvar(iv)

功能说明:通过为其保留适量的内存位置俩初始化大/闪存变量。

3. bigrand()

函数原型:void bigrand(big w,big x)

功能说明:产生一个小于w的大随机数,x

4. egcd()

函数原型:int egcd(big x,big y,big z)

功能说明:计算两个数的最大公约数,z=gcd(x,y)

5. powmod()

函数原型:void powmod(big x,big y,big z,big w)

功能说明:模冥运算,w=x^y mod z

6. mirkill()

函数原型: void mirkill(x)

功能说明:通过将其归零并释放其内存来安全的杀死大/闪存数字。

7. compare()

函数原型:int compare(big x,big y)

功能说明:比较两个数大小,x>y时返回+1,x=y时返回0,x

五、算法步骤

Fermat素性检验算法:给定奇整数m>=3和安全参数k=6(这里我取6)

(1)随机选取整数a, 2<=a<=m-2 (2)计算g=(a,m),如果g=1,转(3);否则,跳出,m为合数

(3)计算 r=a^(m-1)(mod m), 如果r=1,m可能是素数,转(1);

否则,跳出,m为合数。

(4)重复上述过程k此,如果每次得到m可能为素数,则m为素数

的概率为1-1/2^k。

六、实验代码

1 #include"miracl.h"

2 #include

3 intmain (){4 FILE *fp;5 int i=0,k=4;6 big m,a,b,c,d,e; //定义大整数变量

7 miracl *mip=mirsys(10000,10); //初始化MIRACL系统,初始化10000位的十进制数

8 mip->IOBASE=10; //控制输入输出的进制,这里输入和输出变量使用的都是十进制

9 m=mirvar(0); //初始化大整数变量

10 a=mirvar(0);11 b=mirvar(0);12 c=mirvar(0);13 d=mirvar(0);14 e=mirvar(1); //big 1

15 fp=fopen("验收数据例子.txt","r"); //以读的方式打开文件

16 if(fp==NULL){17 printf("找不到指定文件,无法打开!");}18 else

19 {20 cinnum(m,fp); //从文件中读取大整数并放入大整数变量m中

21 fclose(fp);22 decr(m,1,b); //大整数变量减去int型整数,这里相当于b=m-1

23 for (i=0;i

25 {bigrand(b,a);}26 egcd(a,m,d); //计算两个大数a和m的最大公约数d

27 if(!compare(d,e)){ //判断d是否为1,即m和a是否互为质数,不等于1则跳出,判断出m为合数

28 powmod(a,b,m,c); //模冥运算,c=a^b mod(m)

29 if(!compare(c,e)) //判断c是否等于1,不等于1则跳出,判断出出m为合数

30 {31 if(i==(k-1))32 {printf("m有93.75%的可能性为素数!");} //如果每次循环都得到可能是素数的结论,则最后打印出结果

33 }34 else{printf("m为合数!");35 break;}36

37 }38 else {printf("m为合数!");39 break;}40 }41 mirkill(m); //释放内存大数所占的内存

42 mirkill(a);43 mirkill(b);44 mirkill(c);45 mirkill(d);46 mirkill(e);47 }48 mirexit(); //清除MIRACL系统,释放所有的内部变量

49 return 0;50 }

注:其中需要在源文件和头文件中加入miracl库的相应文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值