DSA加密算法是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。它是一种公开密钥算法,用作数字签名。DSA加密算法使用公开密钥,为接受者验证数据的完整性和数据发送者的身份,它也可用于由第三方去确定签名和所签数据的真实性。

信息交流中,接收方希望收到的信息未被窜改(信息完整性),还希望接收到的信息确由自己认定的发送方所发(信息来源有效性),那么接收方和发送方就可以约定,共同使用DSA加密算法来实现。

算法中应用了下述参数:

p:L bits长的素数。L是64的倍数,范围是512到1024;

q:p - 1的160bits的素因子;

g:g = h^((p-1)/q) mod p,h满足h < p - 1, h^((p-1)/q) mod p > 1;

x:私钥。x为一个随机或伪随机生成的整数,其值满足0<x<q;

y:公钥。y=powm(g,x,p)。

注意:

1、整数p,q,g可以公开,也可以仅由一组特定用户共享。

2、私钥x和公钥y称为一个密钥对(x,y),私钥只能由签名者本人独自持有,公钥则可以公开发布。密钥对可以在一段时间内持续使用。

签名产生过程如下:

1. P产生随机数k,k < q;

2. P计算 r = ( g^k mod p ) mod q

s = ( k^(-1) (H(m) + xr)) mod q

签名结果是( m, r, s )。

3. 验证时计算 w = s^(-1)mod q

u1 = ( H( m ) * w ) mod q

u2 = ( r * w ) mod q

v = (( g^u1 * y^u2 ) mod p ) mod q

若v = r,则认为签名有效。

DSA加密算法的安全性:

DSA加密算法主要依赖于整数有限域离散对数难题,素数P必须足够大,且p-1至少包含一个大素数因子以抵抗Pohlig &Hellman算法的攻击。M一般都应采用信息的HASH值。DSA加密算法的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。

重要特点:两个素数公开

DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。

小知识之公开密钥:

公开密钥也称为非对称密钥,每个人都有一对唯一对应的密钥:公开密钥(简称公钥)和私人密钥(简称私钥),公钥对外公开,私钥由个人秘密保存;用其中一把密钥加密,就只能用另一把密钥解密。