实验三DSA数字签名算法姓名:学号:学院:信息工程学院指导老师:郑明辉1.DSA算法原理数字签名是数据在公开行信道中传输的安全保障,能够实现数据的公开、公正、不可抵赖等特点的方法,只能公开的密钥、密码签名算法。国际供认的公开密钥签字算法主要有RSA算法、ElGAMAL算法或者其变形的签名算法。DSA(DigiteSignatureArithmotic)是Schnore和ElGamal算法的变型。美国国家标准技术研究所(NIST)1994年5月19日公布了数字签名标准的(DSS),标准采用的算法便是DSA,密钥长度为512~1024位。密钥长度愈长,签名速度愈慢,制约运算速度的只要因素是大数的模指数运算。2.DSA签名中的参数参数描述:DigitalSignatureAlgorithm(DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignatureStandard)。算法中应用了下述参数:p:Lbits长的素数。L是64的倍数,范围是512到1024;q:p-1的160bits的素因子;g:g=h^((p-1)/q)modp,h满足hp-1,h^((p-1)/q)modp1;x:xq,x为私钥;y:y=g^xmodp,(p,q,g,y)为公钥;H(x):One-WayHash函数。DSS中选用SHA(SecureHashAlgorithm)。p,q,g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。签名及验证协议如下:1.P产生随机数k,kq;2.P计算r=(g^kmodp)modqs=(k^(-1)(H(m)+xr))modq签名结果是(m,r,s)。3.验证时计算w=s^(-1)modqu1=(H(m)*w)modqu2=(r*w)modqv=((g^u1*y^u2)modp)modq若v=r,则认为签名有效。DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。3.源码描述#includestdafx.h#includestring.h#includestdio.h#includeBigInt.h#includesha1.h#includetime.hintshas1(constunsignedintx[],unsignedchardigest[20]){SHA1_CTXcontext;unsignedcharbuffer[16384];//,digest[20];//FILE*file;SHA1Init(&context);SHA1Update(&context,buffer,1);SHA1Final(digest,&context);return0;}CBigIntsha(CBigInty){SHA1_CTXcontext;CBigIntX;unsignedcharbuffer[16384],digest[20];CStringstr;char*t=0123456789ABCDEF;if((y.m_nLength==1)&&(y.m_ulValue[0]==0)){str=0;X.Mov(0);returnX;}str=;inta;charch='\0';str.Insert(0,ch);X.Mov(y);while(X.m_ulValue[X.m_nLength-1]0){a=X.Mod(16);ch=t[a];str.Insert(0,ch);X.Mov(X.Div(16));}inti=0;while(str[i]0)i++;for(a=i,i=0;ia;i++)buffer[i]=str[i];for(i=a;i64;i++)buffer[i]='\0';SHA1Init(&context);SHA1Update(&context,buffer,1);SHA1Final(digest,&context);intlen=str.GetLength(),k;X.Mov(0);for(i=0;i20;i++){X.Mov(X.Mul(256));//if((digest[i]='0')&&(digest[i]='9'))k=digest[i];//elseif((digest[i]='A')&&(digest[i]='F'))k=digest[i]-55;//elseif((digest[i]='a')&&(digest[i]='f'))k=digest[i]-87;//elsek=0;X.Mov(X.Add(k));}returnX;}CBigIntmakerandnumber(unsignedintlen){srand(time(NULL));CBigIntX;X.m_nLength=(len+31)/32;//X.Mov(0);for(unsignedintj=0;jX.m_nLength;j++){X.m_ulValue[j]=rand()*0x10000+rand();}X.m_ulValue[0]=X.m_ulValue[0]|0x1;X.m_ulValue[j-1]=X.m_ulValue[j-1]|0x80000000;returnX;}CBigIntpow2(constintx,inty){CBigIntp,q,t;p.Mov(1);q.Mov(x);while(y0){if(y%2==0){q.Mov(q.Mul(q));y/=2;}else{p.Mov(p.Mul(q));y-=1;}}returnp;}CBigIntpow3(CBigIntx,CBigInty,CBigIntm){CBigIntp,t;p.Mov(1);t.Mov(0);while(y.Cmp(t)0){if(y.m_ulValue[0]&0x1==0){x.Mov(x.Mul(x));x.Mov(x.Mod(m));x.Mov(x.Div(2));}else{p.Mov(p.Mul(x));p.Mov(p.Mod(m));y.Mov(y.Sub(1));}}returnp;}4.过程及结果截图描述开始运行选择512位密钥长度,点击公开参数,如下图随便选择一个你要签名的文件,然后选择算法点击数字签名然后点击签名验证