ElGamal公钥密码体制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ElGamal公钥密码体制

1、问题描述

设计ElGamal公钥密码体制算法。

2、算法设计

(1)选取大素数p和p的一个原根a,(a,p)=1,1

(2)随机选取整数d,1

(3)加密:对0

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"<

}

运行结果

相关文档
最新文档