《DH算法C语言实现.docx》由会员分享,可在线阅读,更多相关《DH算法C语言实现.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#include#include#include#includeint Random_Odd();int SPrime(int odd);int MoChongFu(int m, int e,int n);int MoChongFua(int m, int e,int n);int milejiance(int odd);int yuangen(int yy);int S_PrimeTable7 = 3,5,7, 11, 13, 17, 19 );int main(void)(int yy=O;int gg;int A,B,Key,Key 1 ,Key2;int SA,SB;int i,fla
2、gl,flag2; doq-printf(n *) while(yy = Random_Odd();yy = Random_Odd();printf(产生的随机数是:dnn,yy);flagl=!SPrime(yy);for(i=0;i5;i+)flag2=! milej iance(yy);if(flag2)(printf(第d次米勒检测未通过。nn”,i+l);printf(因为第d次米勒检测没有通过,所以随机数d不是素数,n产 生下一个随机数,先用小素数试除,再进行5次米勒检测,如果小素数试除通过并且5次都 通过,则说明该随机数是大素数。”,i+l,yy);printf(HnM);got
3、o q;elseprintf(第d次米勒检测通过。nnH,i+l);while(flagl|flag2);gg=yuangen(yy);srand(time(NULL);A 二 rand()%(96)+32;B = rand()%(96)+32;printf(Alice 选择的随机数 A 是:%dnn,A); printf(uBob 选择的随机数 B 是:%dnnH,B);printf(计算 SA=(ggAA) mod yy:nH);SA=MoChongFua(gg,A,yy); printf(nnn);printf(计算 SB=(ggAB) mod yy:nn);SB=MoChongFua(
4、gg,B,yy);printf(所以 SA 和 SB 分别是:d,%dnnSA,SB); printf(”计算 Keyl=(SBAA) mod yy:nH);Key 1 =MoChongFua(SB,A,yy);printf(nnn);printf(计算 Key2=(SAAB) mod yy:nH);Key2=MoChongFua(SA,B,yy);printf(所以:Key 1 =%d,Key2=%dnnn,Key l,Key2);if(Key 1 =Key2)Key=Keyl;printf(所以共同密钥 Key 是:%dnnn,Key);return 0;产生一个随机数int Random
5、_Odd() (int odd = 0;while (1) (srand(time(NULL);odd = rand() % (16384) + 16384;if(odd%2 !=0)break;/printf(n%dnn, odd); return odd;)/如果是素数的话返回1int SPrime(int odd) (int i, r, k = 0;for (i = 0; i7; i+) (r = odd % S_PrimeTablei;printf(第d 次小素数%(1 试除的余数为d.n”, i + 1, S_PrimeTablei, r); if (r = 0) (printf(小
6、素数试除判断d不是素数。nn;odd);return 0;) )printf(”小素数试除判断d是素数。nnn,odd);return 1;)int MoChongFu(int m, int e,int n)(int binary22;int count=0,i;int a=l,b;b=m;dobinary count=e%2;e=e/2;count+;while(e!=0);for(i=0;icount;i+) (if(binaryi=l)a=(a*b)%n;b=(b*b)%n;)if(binaryi=O) (a=a; b=(b*b)%n;) return a;)int MoChongFua
7、(int m, int e,int n)(int binary! 22;int count=0,i; int a=l,b;b=m;dobinarycount=e%2;e=e/2;count+;while(e!=O);for(i=0;icount;i+) if(binaryi=l)(a=(a*b)%n;b=(b*b)%n;printf(Ma=%d, b=%dnn,a,b);)if(binaryi=O) (a=a;b=(b*b)%n;printf(na=%d, b=%dn,a,b);)米勒检测int milejiance(int odd)(int s=0,i,count=0;int a,b,t,n
8、um;num=odd-l;while(l)(if(num%2=0)(s+;num=num/2;) else(Gum;break;)printf(将d 写成51 =2A%d*%dttnodd,odd,s,t);a=rand()%(odd-3)+2;printf(产生的随机数a是:%dn;a);b=MoChongFu(a,t,odd);printf(第1次算出的余值是:%dnb);if(b%odd= l|b=(odd-l) (return 1;)for(i=l;is;i+)b=(b*b)%odd;printf(第d次算出的余值是:%d n”,i+l,b);if(b=(odd-l)return 0;
9、 )欧拉函数的素因数和两者的商int yuangen(int yy)(int n=2,g=0,q,k,j=0,a10;血gg;int c 10;q=yy-1;while(l)(if(q%n=0)(aj=n;j+;while(!(q%n) q=q/n;)n+;if(qn)break;)printf(模d的欧拉函数分解质因数为:n”,yy);for(n=0;nj;+n) (printf(n%d n,an);)printf(Hnnn);printf(所以指数为:”);for(n=0;nj;+n)cn=(yy-l)/an;printf(n%d cn);)printf(Hnnn);for(g=2;g+)(for(n=0;n32&k1024) (printff取介于2八5到2八10之间的一个原根值为:”); printf(n%dnnn,k);return k;)