资源简介
使用Elgamal公钥密码系统实现数字签名的程序,程序很小巧。可以自动生成大素数,经测试无误。
代码片段和文件信息
#include
#include
#include
using namespace std;
int ab;
int prime_number_p();
int random(int);
int m_develop(int );
/*---------------------------------*/
int prime(int p)
{int ij;
for(i=2;i{j=p%i;
if(j==0)return 0;
}
return 1;
}//判断是否为素数若为素数则返回1
/*------------------------------------*/
int prime_number_max(int nint m)
{
int p;
for(p=m;p>=n;p--)
{if(prime(p)==1)
return p;
}
}//求出nm之间的最大素数
/*--------------------------------*/
int prime_number_p()
{
int pmn;
cout<<“为一组用户产生一个公钥P(p为素数)“< cout<<“请输入p所在范围n,m(系统将选择最大的素数P)“< cout<<“n=“;
cin>>n;
cout<<“m=“;
cin>>m;
p=prime_number_max(nm);
if(p==0)
{
cout<<“nm中无素数“;
p=prime_number_p();
}
return p;
}//p的产生
/*-------------------------------*/
int Random_number_g(int p)
{ int g;
srand((int) time (NULL));
g=rand()%p;
return g;
}//g的产生
int PKI_y(int pint gint x)
{int y;
int i;
y=1;
for(i=0;i {y*=g;
y%=p;}
return y;
}//公钥y的产生
int gcd(int aint b)
{
int s[50]q[50];
if(a>b)
{
s[0]=a;
s[1]=b;
}
else
{
s[0]=a;
s[1]=b;
}
for(int i=1;i<100;i++)
{
s[i+1]=s[i-1]%s[i];
q[i]=s[i-1]/s[i];
if(s[i+1]==0) return s[i];
}
//return s[i];
}//求a,b是否互素
/*----------------------------------*/
int m_develop(int p)
{
int m;
cin>>m;
if (m>p)
{
cout<<“无法对输入的m进行签名请重新输入“< m=m_develop(p);
}
return m;
}
int prime_k(int p)
{
int ki;
k=rand()%p;
i=gcd(kp-1);
if(i!=1)
{
k=prime_k(p);
}
return k;
}//随即数k的产生
/*-----------------------------------*/
void elg_sign_develop(int gint pint xint m)
{
int k;
int i=1;
k=prime_k(p);//产生一个k的随机数k与p-1互质
//a=(g^k)%p;
for(i=0;i {
a*=g;
a%=p;
}
//while(m!=(a*x+k*i)%(p-1))
//{i++;}b=i;
for(i=0;i {
b=i;
if((x*a+k*b)%(p-1)==m) break;
}
k=0;//丢弃随即数K
cout< }//产生签名
/*-------------------*/
void elg_sign_test(int yint pint mint g)
{int ic1d1j;
c1=d1=j=1;
//i=((y^a)*(a^b))%p;
for(i=0;i{
c1*=y;
c1%=p;
}
for(i=0;i{
d1*=a;
d1%=p;
}
d1*=c1;
d1%=p;
//j=(g^m)%p;
for(i=0;i {
j*=g;
j%=p;
}
if(d1==j)
{
cout<<“是用户签名的。“< }
else
{
cout<<“不是用户签名的“< }
}//验证签名
/*------------------*/
void main()
{
int pgxymi;
a=b=1;
//char name;
p=prime_number_p();//产生大素数p
g=Random_number_g(p);//产生随即数g
cout<<“此用户组的公共参数为p=“<//cout<<“输入用户名“< //cin>>name;
x=p+1;
while(x>=p)
{cout<<“输入用户密码“< cin>>x;
if(x>=p)
cout<<“密码格式错误;“< y=PKI_y(pgx);//公钥y的产生
cout<<“公钥y是“< cout<<“输入要签名的字符m“< m=m_develop(p);
elg_sign_develop(gpxm);
elg_sign_test(ypmg);
system(“pause“);
/*jj:cout<<“结束程序请输入0“< cin>>i;
if(i==0)
exit(0);
else
goto jj;*/
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 476 2012-09-08 14:34 Elgdown\Debug\cl.command.1.tlog
文件 7066 2012-09-08 14:34 Elgdown\Debug\CL.read.1.tlog
文件 204 2012-09-08 14:34 Elgdown\Debug\CL.write.1.tlog
文件 40960 2012-09-08 14:34 Elgdown\Debug\Elgdown.exe
文件 381 2012-09-08 14:34 Elgdown\Debug\Elgdown.exe.intermediate.manifest
文件 381968 2012-09-08 14:34 Elgdown\Debug\Elgdown.ilk
文件 48 2012-09-08 14:34 Elgdown\Debug\Elgdown.lastbuildstate
文件 2102 2012-09-08 14:34 Elgdown\Debug\Elgdown.log
文件 59906 2012-09-08 14:34 Elgdown\Debug\elgdown.obj
文件 568320 2012-09-08 14:34 Elgdown\Debug\Elgdown.pdb
文件 1046 2012-09-08 14:34 Elgdown\Debug\li
文件 2154 2012-09-08 14:34 Elgdown\Debug\li
文件 408 2012-09-08 14:34 Elgdown\Debug\li
文件 368 2012-09-08 14:34 Elgdown\Debug\mt.command.1.tlog
文件 706 2012-09-08 14:34 Elgdown\Debug\mt.read.1.tlog
文件 192 2012-09-08 14:34 Elgdown\Debug\mt.write.1.tlog
文件 207872 2012-09-08 14:34 Elgdown\Debug\vc100.idb
文件 241664 2012-09-08 14:34 Elgdown\Debug\vc100.pdb
文件 3105 2012-09-08 14:34 Elgdown\elgdown.cpp
文件 5656576 2013-06-20 14:29 Elgdown\Elgdown.sdf
文件 880 2012-09-08 14:24 Elgdown\Elgdown.sln
..A..H. 10752 2013-06-20 14:29 Elgdown\Elgdown.suo
文件 3224 2012-09-08 14:24 Elgdown\Elgdown.vcxproj
文件 958 2012-09-08 14:24 Elgdown\Elgdown.vcxproj.filters
文件 143 2012-09-08 14:24 Elgdown\Elgdown.vcxproj.user
文件 14483456 2013-06-20 14:22 Elgdown\ipch\elgdown-c57dcb77\elgdown-4242373c.ipch
目录 0 2013-06-20 14:22 Elgdown\ipch\elgdown-c57dcb77
目录 0 2012-09-08 14:34 Elgdown\Debug
目录 0 2013-06-20 14:22 Elgdown\ipch
目录 0 2013-06-20 14:29 Elgdown
............此处省略3个文件信息
- 上一篇:开放充电协议标准2.0 OCPP 2.0
- 下一篇:大漠插件颜色和字库
评论
共有 条评论