#include using namespace std; unsigned long moni(int n,unsigned long d) { unsigned long a,b,r,q; long v,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(v<0) v=n+v; return v; } unsigned long Erjinzhif(int m,int a) //定义二进制求m的a次方运算的函数 { unsigned long num; int y,i,sum; int g=0,d[32]={0}; sum=0; num=1; while(a>0) //用求二进制的方法求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; else y=1; num=num*y; num=num*num; } return num; } void main() //用求出的二进制的各位作指数与原值相乘再求平方 //主函数main { int i,p,a,b,c,x,r,y1,y2,m,g; unsigned long x1,y; y1=1; y2=1; m=1; c=1; cout<<\"************ElGamal密码算法的应用************\"< cin>>b; cout<<\"请输入大素数p的值:p=\"; cin>>p; cout<<\"请输入随机整数a(a>=0&&a<=(p-2))的值:a=\"; cin>>a; cout<<\"请输入要发送的消息x的值:x=\"; cin>>x; cout<<\"请输入随机数r(r>=0&&r<=(p-2))的值:r=\"; cin>>r; for(i=0;i<(a*r);i++) { y2=b*y2; y2=y2%p; } for(i=0;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<<\"*********************************************\"< 因篇幅问题不能全部显示,请点此查看更多更全内容