医工互联

 找回密码
 注册[Register]

手机动态码快速登录

手机号快速登录

微信登录

微信扫一扫,快速登录

QQ登录

只需一步,快速开始

查看: 60|回复: 0
收起左侧

DSA(数字签名算法)详解

[复制链接]

  离线 

发表于 7 小时前 | 显示全部楼层 |阅读模式 <
DSA(Digital Signature Algorithm)是美国国家标准与技术研究院(NIST)提出的数字签名标准(FIPS 186),专门用于生成和验证数字签名,与RSA不同,DSA仅用于签名,不能用于加密。


1. DSA核心特性

特性说明算法类型非对称算法(公钥密码体系)用途数字签名(生成/验证)密钥长度通常1024/2048/3072位(NIST推荐≥2048位)数学基础离散对数问题(DLP)标准版本FIPS 186(1994初版,186-5为最新版)对比RSADSA签名更快,但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​⋅yu2​modp)modq。
    • 若 v=rv=r,则签名有效。


3. DSA参数示例

python
复制
下载
  1. # 示例参数(实际应用需更大素数)
  2. p = 7879  # 模数
  3. q = 101   # 子群阶(q | p-1)
  4. g = 170   # 生成元(g^q ≡ 1 mod p)
  5. x = 42    # 私钥
  6. y = pow(g, x, p)  # 公钥 = g^x mod p
复制代码

4. DSA与ECDSA对比

特性DSAECDSA(椭圆曲线DSA)数学基础有限域离散对数椭圆曲线离散对数密钥长度较长(2048位≈112位安全)更短(256位≈128位安全)性能较慢更快应用场景传统系统现代加密(比特币/TLS)
5. DSA代码实现(Python)

python
复制
下载
  1. from Crypto.PublicKey import DSA
  2. from Crypto.Signature import DSS
  3. from Crypto.Hash import SHA256
  4. # 生成密钥对
  5. key = DSA.generate(2048)
  6. private_key = key
  7. public_key = key.publickey()
  8. # 签名
  9. message = b"Hello, DSA!"
  10. hash_obj = SHA256.new(message)
  11. signer = DSS.new(private_key, 'fips-186-3')
  12. signature = signer.sign(hash_obj)
  13. # 验证
  14. verifier = DSS.new(public_key, 'fips-186-3')
  15. try:
  16.     verifier.verify(hash_obj, signature)
  17.     print("签名有效!")
  18. except ValueError:
  19.     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
复制
下载
  1. openssl dsaparam -genkey 2048 > dsakey.pem
  2. openssl dsa -in dsakey.pem -pubout -out dsapub.pem
复制代码
(2)签名与验证

bash
复制
下载
  1. # 签名
  2. openssl dgst -sha256 -sign dsakey.pem -out signature.bin message.txt
  3. # 验证
  4. openssl dgst -sha256 -verify dsapub.pem -signature signature.bin message.txt
复制代码

总结



  • DSA是经典签名算法,但逐渐被ECDSA取代。
  • 关键优势:标准化(FIPS)、签名效率高。
  • 关键风险:随机数k管理不当会导致私钥泄露。
  • 现代替代方案:ECDSA(基于椭圆曲线)、EdDSA(Ed25519)。
回复

使用道具 举报

温馨提示:发帖前请认真阅读『版块介绍』『总版规』,违规发帖会遭到严重处罚!

提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!
您需要登录后才可以回帖 登录 | 注册[Register] 手机动态码快速登录 微信登录

本版积分规则

发布主题 快速回复 收藏帖子 返回列表 客服中心 搜索
简体中文 繁體中文 English 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

QQ|RSS订阅|小黑屋|处罚记录|手机版|联系我们|Archiver|医工互联 |粤ICP备2021178090号 |网站地图

GMT+8, 2025-5-18 14:50 , Processed in 0.209291 second(s), 57 queries .

Powered by Discuz!

Copyright © 2001-2023, Discuz! Team.

快速回复 返回顶部 返回列表