简史
graph LR
DSA---suggest["1911年8月NIST提出"]
DSA---publish["1994年5月发布"]
DSA---enemy["它是RSA的对手"]
DSA---condemn["已花钱实现RSA的公司<br>最初排斥它"]
密钥对
公钥
参数 | 说明 |
---|
p | 素数,长度为L位 |
q | q是p−1的素因子,长度为N位 |
g | g=h(p−1)/q mod p,其中h为满足以下条件的数: h(p−1)/q mod p>1 h的挑选范围:[2,p−2] |
y | y=gx mod p |
私钥
密钥对生成
根据FIPS 186-4的建议,L和N的组合包括:(1024, 60),(2048, 224),(2048, 256),(3072, 256)。当然你也可以不遵守此建议。
- 随机生成q
- 随机生成p,其中p需要满足该条件:(p−1)=n∗q
- 从[2,p−2]中选择一个h,满足该条件:h(p−1)/q mod p>1
- 计算出g=h(p−1)/q mod p
- 随机生成x,x<q
- 计算出y=gx mod p
签名与验签
签名
- 生成随机数k(k<q)
- r=(gk mod p) mod q
- s=(k−1(H(m)+x∗r)) mod q
其中r和s构成签名值。
验签
- w=s−1 mod q
- u1=H(m)∗w mod q
- u2=r∗w mod q
- v=(gu1∗yu2 mod p) mod q
- 如果v=r成立,则验签成功。
其中H(m)表示对消息m进行摘要计算。
验签正确性证明
(一)
s=(k−1(H(m)+xr)) mod q
s−1∗s=1 mod q
即:s−1∗k−1(H(m)+xr)=1 mod q
则有:k=H(m)∗s−1+x∗r∗s−1 mod q
即:k=H(m)∗w+x∗r∗w mod q
(二)
根据(一)有:
gk=gH(m)∗w∗gx∗r∗w
=gH(m)∗w∗(gx)r∗w
=gu1∗yu2 mod p
(三)
根据(二)有:
(gk mod p) mod q=(gu1∗yu2 mod p) mod q
即r=v
证毕。
DSA签名特点
- 引入了随机数,使得即使消息相同,每次签名值都会变化。
- 安全性和RSA差不多
- p和q公开,能确认它们是否为随机产生的,还是做了手脚。
DSA的安全性
DSA的安全性建立求解离散对数很难的基础上。
具体来讲就是,已知公钥p,q,g,y很难求解出对应的离散对数即私钥x。
在实际应用上,L应达到1024,才具有长期的安全性。
参考资料
Digital Signature Algorithm (DSA) in Cryptography: A Complete Guide | Simplilearn
(14条消息) DSA-数据签名算法(理论)_aaqian1的博客-CSDN博客_dsa算法