DSSDSA(DigitalSignatureAlgorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignatureStandard)。算法中应用了下述参数:p:Lbits长的素数。L是64的倍数,范围是512到1024;q:p-1的160bits的素因子;g:g=h^((p-1)q)modp,h满足h<p-1,h^((p-1)q)modp>1;x:x<q,x为私钥;y:y=g^xmodp,(p,q,g,y)为公钥;H(x):One-WayHash函数。DSS中选用SHA(SecureHashAlgorithm)。
p,q,g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。签名及验证协议如下:
(1)P产生随机数k,k<q;
(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算法却作不到。