c1 ≡ak (mod p), c2 ≡ m bk (mod p)
(4)解密:明文m ≡c2 ( c1 d) -1 (mod p)
主要步骤
3、算法分析
该算法的基础是找到一个原根,大数的原根产生过程比较慢,本人目前也只能产
生8位以内的素数的原根,还有待改进。同时也涉及到模幂运算,选取的幂指数
如果较大,时间复杂度也会相应的增加。
int inverse(int a,int m)
{
long int c,d;
int j;
int q[100],r[100],t[100],s[100];
c=a;d=m;
r[0]=c;
r[1]=d;
s[0]=1;
s[1]=0;
t[0]=0;
t[1]=1;
for(j=1;r[j]!=0;j++)
{
q[j]=(int)(r[j-1]/r[j]);
r[j+1]=r[j-1]-q[j]*r[j];
if(j>=2)
{
s[j]=s[j-2]-q[j-1]*s[j-1];
t[j]=t[j-2]-q[j-1]*t[j-1];
}
}
return s[j-1];
}
int gcd(int a,int b)
{
int c;
if(a
{
c=b;
b=a;
a=c;
}
while(b!=0)
{
c=b;
b=a%b;
a=c;
}
return a;
}
void main()
{
int p,g,k,s,x,r,t=1,i,j,f,y,m,M;
cin>>p>>g>>k;
s=2;
for(i=1;i<=k;i++)
{
t*=s;
t=t%p;
}
while(t<0)
{
t=t+p-1;
}
cout<<"public key is"<<"("<cin>>r;
if(gcd(p-1,r)!=1)cout<<"the data is not suitable"<x=1;
for(j=1;j<=r;j++)
{
x*=s;
x=x%p;
}
cin>>m;
f=inverse(r,p-1);
y=(m-k*x)*f%(p-1);
while(y<0)
{
y=y+p-1;
}
cout<<"the signature is"<<"("<for(i=1;i<=m;i++)
{
g*=g;
}
g=g%p;
for(i=1;i{
y*=y;
}
for(j=1;j{
x*=x;
}
M=x*y%p;
if(M=p){cout<<"the signature is useful"<else{cout<<"the signature is not useful"<}
运行结果