資源簡介
使用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
- 下一篇:大漠插件顏色和字庫
評論
共有 條評論