DSA(Digital Signature Algorithm)是美国国家标准与技术研究院(NIST)提出的数字签名标准(FIPS 186),专门用于生成和验证数字签名,与RSA不同,DSA仅用于签名,不能用于加密。
1. DSA核心特性
特性 | 说明 |
---|---|
算法类型 | 非对称算法(公钥密码体系) |
用途 | 数字签名(生成/验证) |
密钥长度 | 通常1024/2048/3072位(NIST推荐≥2048位) |
数学基础 | 离散对数问题(DLP) |
标准版本 | FIPS 186(1994初版,186-5为最新版) |
对比RSA | DSA签名更快,但RSA用途更广(支持加密) |
2. DSA算法原理
(1)参数生成
-
选择素数:
-
选取大素数 p(模数,长度≥1024位)。
-
选取素数 q(子群阶,160-256位),满足 q | (p-1)。
-
-
生成生成元:
-
找到整数 g,使得 gq≡1mod pgq≡1modp。
-
-
密钥对生成:
-
私钥 x:随机整数(1<x<q1<x<q)。
-
公钥 y:y=gxmod py=gxmodp。
-
(2)签名生成
-
选择随机数:
-
生成临时密钥 k(1<k<q1<k<q)。
-
-
计算签名:
-
r=(gkmod p)mod qr=(gkmodp)modq。
-
s=[k−1(H(m)+x⋅r)]mod qs=[k−1(H(m)+x⋅r)]modq。
-
签名 = (r,s)(r,s),其中 H(m)H(m) 是消息的哈希值(如SHA-256)。
-
(3)签名验证
-
计算中间值:
-
w=s−1mod qw=s−1modq。
-
u1=H(m)⋅wmod qu1=H(m)⋅wmodq。
-
u2=r⋅wmod qu2=r⋅wmodq。
-
-
验证等式:
-
v=(gu1⋅yu2mod p)mod qv=(gu1⋅yu2modp)modq。
-
若 v=rv=r,则签名有效。
-
3. DSA参数示例
python
复制
下载
# 示例参数(实际应用需更大素数) p = 7879 # 模数 q = 101 # 子群阶(q | p-1) g = 170 # 生成元(g^q ≡ 1 mod p) x = 42 # 私钥 y = pow(g, x, p) # 公钥 = g^x mod p
4. DSA与ECDSA对比
特性 | DSA | ECDSA(椭圆曲线DSA) |
---|---|---|
数学基础 | 有限域离散对数 | 椭圆曲线离散对数 |
密钥长度 | 较长(2048位≈112位安全) | 更短(256位≈128位安全) |
性能 | 较慢 | 更快 |
应用场景 | 传统系统 | 现代加密(比特币/TLS) |
5. DSA代码实现(Python)
python
复制
下载
from Crypto.PublicKey import DSA from Crypto.Signature import DSS from Crypto.Hash import SHA256 # 生成密钥对 key = DSA.generate(2048) private_key = key public_key = key.publickey() # 签名 message = b"Hello, DSA!" hash_obj = SHA256.new(message) signer = DSS.new(private_key, 'fips-186-3') signature = signer.sign(hash_obj) # 验证 verifier = DSS.new(public_key, 'fips-186-3') try: verifier.verify(hash_obj, signature) print("签名有效!") except ValueError: print("签名无效!")
6. DSA的安全性
(1)已知攻击
-
随机数k复用:若两次签名使用相同的k,私钥x可被破解。
(例如2010年索尼PS3漏洞) -
短密钥攻击:1024位DSA已被认为不安全(NIST建议≥2048位)。
(2)安全建议
-
使用强随机数生成器(避免k重复)。
-
选择足够大的p和q(至少2048位)。
-
优先选择ECDSA(更高效且安全)。
7. DSA的应用场景
-
数字证书:早期SSL/TLS证书(现多被ECDSA取代)。
-
代码签名:软件发布者验证(如微软驱动签名)。
-
政府文档:符合FIPS标准的电子签名。
8. OpenSSL中的DSA操作
(1)生成密钥对
bash
复制
下载
openssl dsaparam -genkey 2048 > dsakey.pem openssl dsa -in dsakey.pem -pubout -out dsapub.pem
(2)签名与验证
bash
复制
下载
# 签名 openssl dgst -sha256 -sign dsakey.pem -out signature.bin message.txt # 验证 openssl dgst -sha256 -verify dsapub.pem -signature signature.bin message.txt
总结
-
DSA是经典签名算法,但逐渐被ECDSA取代。
-
关键优势:标准化(FIPS)、签名效率高。
-
关键风险:随机数k管理不当会导致私钥泄露。
-
现代替代方案:ECDSA(基于椭圆曲线)、EdDSA(Ed25519)。