/*α=2,p=7,a=3,x=8,r=5;加密变换Ek(x,r)=(y1,y2)*/#includeiostreamusingnamespacestd;unsignedlongmoni(intn,unsignedlongd)//定义求模逆运算的函数{unsignedlonga,b,r,q;longv,w,t;a=n;b=d;t=0;v=1;q=a/b;r=a%b;while(r!=0)//用展转相除法求模逆{a=b;b=r;w=v;v=t-q*v;t=w;q=a/b;r=a%b;}if(v0)v=n+v;returnv;}unsignedlongErjinzhif(intm,inta)//定义二进制求m的a次方运算的函数{unsignedlongnum;inty,i,sum;intg=0,d[32]={0};sum=0;num=1;while(a0)//用求二进制的方法求m的a次方,将a化为二进制{sum=a%2;d[g]=sum;g++;a=(int)(a/2);}num=m*m;for(i=g-2;i=1;i--)//用求出的二进制的各位作指数与原值相乘再求平方{if(d[i]==1)y=m;elsey=1;num=num*y;num=num*num;}returnnum;}voidmain()//主函数main{inti,p,a,b,c,x,r,y1,y2,m,g;unsignedlongx1,y;y1=1;y2=1;m=1;c=1;cout************ElGamal密码算法的应用************endl;cout请输入本原α的值:α=;cinb;cout请输入大素数p的值:p=;cinp;cout请输入随机整数a(a=0&&a=(p-2))的值:a=;cina;cout请输入要发送的消息x的值:x=;cinx;cout请输入随机数r(r=0&&r=(p-2))的值:r=;cinr;for(i=0;i(a*r);i++){y2=b*y2;y2=y2%p;}for(i=0;ir;i++){y1=y1*b;y1=y1%p;}y=Erjinzhif(a,y1);//调用求y1的a次方的值的函数x1=moni(p,y);//调用求模逆运算的函数g=(x1*c)%p;c=((x%p)*(y2%p))%p;cout*********************************************endl;coutA发送给B的密文:y=(y1,c)endl;cout*********************************************endl;coutB接收到密文解密后明文是:gendl;//模逆结果cout*********************************************endl;}