【实验目的】
1、了解DSS标准;
2、了解DSA数字签名的原理;
3、验证DSA的签名及签名验证过程。
【实验环境】
windows虚拟机。
在目录C:\Program Files\Microsoft Visual Studio\MyProjects\DSAsign下打开DSAsign.dsw,在VC6.0环境下编译代码。
【实验预备知识点】
首先,我们需要选定一个哈希函数H来处理明文,该函数最初为SHA-1,现在SHA-2也可以使用。函数输出有可能需要截短到密钥对的长度,SHA-1算法的实现在SHA1算法的编程实现中已详细讲述过了,在此不再赘述。除此之外,算法各步骤的实现并无难度,只要按照算式编写程序即可。
1.程序主流程图
图 1主流程图
2.程序调用层次图
图 2程序调用层次图
3.程序调用关系图
图 3程序调用关系图
【实验内容】
数字签名标准(DSS)由NIST公布,该标准能够使接收者能够验证数据的完整性和数据发送者的身份而制定,所采用的算法称为DSA算法,也称为DSA签名。DSA签名涉及四个参数,p,q,g,y和x,中前四者构成公钥,x为私钥。依据DSS标准,p为512~1024位,q是160位长的素数,且q|p-1,g是Zp域中的q次单位根,y=gx mod p。m为待签名的明文,h()为一公开的Hash函数。通常,参与签名计算的,并非明文全文,而是明文的杂凑值。算法还使用了随机函数r。
【实验步骤】
以下是程序的关键代码:
//DSA.c
void sign()
{
unsigned long n,p,q,g,x,y,r,s,m,h,k;
unsigned long qun[100];
int i;
printf("\t请输入质数p:");
fflush(stdin);
scanf("%lu",&p);
for(i=2;i<p/2;i++)
if(p%i==0)
{
printf("\tp不是质数\n");
sign();
exit(0);
}
printf("\t选择一个q值:");
q = 1;
n = 0;
while(q <= p)
{
q++;
if((p-1)%q == 0)
{
for(i=2;i<=q/2;i++)
{
if(q%i == 0)