DSA

1、DSA算法描述

1985年提出的ElGamal算法是首次在有限域上基于离散对数问题设计的数字签名方案, DSA算法是在ElGamal算法的基础上设计的, 算法描述如下。

1.1 密钥生成

1) 全局参数

p: 满足2L-1 <p<2L的大素数, 其中L=512+64d, d=0, 1, 2, …, 8 q: p-1 的素因子, 且2159<q<2160。 g: g=h (p-1) /q mod p, 其中h满足1<h<p-1, 且h (p-1) /q mod p>1。

以上3个参数是用户公用的参数, 称之为全局参数, 也称为共享的公共模数。

2) 私钥

x: 选取满足1<x<q的随机数。

3) 公钥

y: 通过y=gx mod p求得。

1.2 签名过程

  1. 生成随机数k, 1<k<q;

  2. 计算r= (gk mod p) mod q;

  3. 计算 s= (k-1 * (H (M) + x * r) ) mod q。 其中M是待签名的消息, H (M) 是由SHA-1(Secure Hash Algorithm-1) 求出的Hash值。

消息M的签名结果即为 (r, s) 。

1.3 验证过程

  1. 计算w=s-1 mod q;

  2. 计算 u1= (H(M) * w) mod q;

  3. 计算 u2= (r * w) mod q;

  4. 计算 v= ( (gu1 * yu2) mod p) mod q。

比较r和v, 如果r=v, 表示签名有效; 否则, 签名非法

2、通用安全攻击(基本都是高复杂度的)

2.1求取私钥

对DSA最直接也是最彻底的攻破方法是利用算法的公开信息求取用户私钥。DSA算法中的公开信息包括:全局参数、公钥、消息和签名, 由这些数据求取私钥有两种方法。

1、根据公钥y计算私钥(基本不可能)

x=loggy(modp)x=log_gy\pmod p x=logg​y(modp)

2、根据公共模数p与q, 消息M, 签名 (r, s) 等公开信息计算随机数k(基本也不可能)

T=gu1yu2(modp)k=loggT(modp)T=g^{u_1}y^{u_2}\pmod p\\ k=log_gT\pmod p T=gu1​yu2​(modp)k=logg​T(modp)

借助k计算私钥
x=r−1(sk−H(M))modqx=r^{-1}(sk-H(M))\mod q x=r−1(sk−H(M))modq
显然上述两种方法的复杂性都是求取离散对数

2.2穷搜索攻击

穷搜索攻击是面向单钥和公钥密码体制的通用攻击方法, 是完全的暴力攻击方法。对于包括DSA在内的所有密码算法, 密钥必须足够长才能抵抗穷搜索攻击, 然而由于公钥体制所使用的可逆函数的计算复杂性与密钥长度常常不是呈线性关系, 而是增大更快, 所以DSA的密钥太长会使签名验证运算太慢而不实用。DSS中规定私钥x的长度为160 bit、公钥y的长度取决于模p的长度L。所以, 采用穷搜索方法攻击DSA时, 即是计算满足y=gx mod p的x值, x的搜索域为2L, 显然, 以目前的计算能力, 采用穷搜索方法攻破DSA是不可能的。

2.3生日攻击

生日攻击是主要面向Hash函数的通用攻击方法, 也可用于攻击基于离散对数问题的密码系统。生日攻击的本质是利用概率性质进行随机攻击。采用生日攻击方法攻击DSA即是用生日攻击求解离散对数y=gx mod p, 计算过程如下。

分别计算gi mod p和 (ygj) mod p, 其中 i和j是√p附近的随机数, 当计算量达到√p个数据时, 两种计算中很有可能有相同者, 即gi≡ygj (mod p) , 由此可以推算出:x≡i-j (mod q) 。

DSA算法中, p的位长为L=512+64d, 所以采用生日攻击需进行2256+32d次运算, 因而DSA面对生日攻击具备足够的安全强度。

2.4伪造攻击

伪造攻击可分为未知消息攻击和已知消息攻击两种情形, 前者属于实体伪造, 危险性很低, 当然, 签名方案仍需考虑抵抗实体伪造, 以提高安全性。这里主要考虑对DSA的已知消息攻击, 若对消息M伪造DSA签名, 有3种方法。

方法1 假设r求解s。伪造者先选取一个小于q的随机数, 假设为r, 然后计算
k=((loggr)modp)modqs=(k−1(H(M)+(loggyr)modp))modqk=((log_gr)mod\;p)mod\;q\\s=(k^{−1}(H(M)+(logg_yr)mod\;p))mod\;q k=((logg​r)modp)modqs=(k−1(H(M)+(loggy​r)modp))modq
方法2 假设s求解r。伪造者先选取一个小于q的随机数, 假设为s, 然后计算
Rs≡gH(M)yRmodq(modp)‚r=RmodqR^s≡g^{H(M)}y^{R\;mod\;q}(mod\;p)‚r=R\;mod\;q Rs≡gH(M)yRmodq(modp)‚r=Rmodq
方法3 假设k求解r和s。伪造者先选取一个小于q的随机数, 假设为k, 然后计算
r=(gkmodp)modqs=(k−1(H(M)+(loggyr)modp))modqr=(g^kmod\;p)mod\;q\\s=(k^{−1}(H(M)+(log_gy^r)mod\;p))mod\;q r=(gkmodp)modqs=(k−1(H(M)+(logg​yr)modp))modq
其中方法1需面对2次求解离散对数问题;方法2需面对1次比求解离散对数问题更复杂的运算;方法3需面对1次求解离散对数问题。因为离散对数问题目前是不可解的, 所以DSA具备充分的抵抗已知消息伪造攻击的安全强度。

3、弱点攻击

寻找密码系统本身的弱点进行攻击往往是最有效的攻击方法, 通过对DSA算法的分析发现, 随机数k与消息无关的签名r, 公共模数p与q以及内嵌的Hash函数是算法可能存在的弱点。

3.1随机数攻击

DSA在每次签名时, 使用了随机数k, 如果对同一消息进行多次签名, 签名结果是不同的, 所以DSA是一种随机式数字签名。如果k值的选取存在缺陷, 根据2.1中给出的计算可知, 攻击者可以很容易地根据k值计算出私钥x。

1)低指数攻击

k不能取值太小, 因为r= (gk mod p) mod q。若k值太小, 攻击者可通过穷搜索的方法得到k值。

2)共k攻击

如果攻击者获得了两个使用相同k值的签名消息, 则可计算
k=((s2−s1)−1(H(M2)−H(M1)))modqk=((s2−s1)^{−1}(H(M2)−H(M1)))modq k=((s2−s1)−1(H(M2)−H(M1)))modq

3)共r攻击

使用同一公钥加密的不同消息,根据r= (gk mod p) mod q,可知k相同,套用2中的理论,可以完成攻击

脚本参考CTFwiki

https://ctf-wiki.github.io/ctf-wiki/crypto/signature/dsa-zh/

DSA签名简介及对其的攻击方式相关推荐

  1. java openssl_verify_CryptoAPI:如何使用CryptVerifySignature验证来自OpenSSL或Java的DSA签名...

    如果不了解CryptoAPI,这应该是非常困难的. 主要障碍是: 使用CryptStringToBinaryA和CryptDecodeObjectEx解码X509 DSA公钥 转换DSA签名格式 Op ...

  2. python实现DSA签名数字证书

    一.数字签名 采用数字签名,能完成这些功能: ​ (1)确认信息是由签名者发送的: ​ (2)确认信息自签名后到收到为止,未被修改过: ​ (3)签名者无法否认信息是由自己发送的. 与公钥加密不同,数 ...

  3. python3 函数签名简介 验证函数参数

    一个函数或方法,它使用*args和**kwargs作为参数,这样使得它比较通用, 但有时候你想检查传递进来的参数是不是某个你想要的类型.可以使用函数签名来做验证 函数签名对象,表示调用函数的方式,即定 ...

  4. 服务器被攻击 常见的服务器攻击方式有哪些

    现在很多网站的服务器都被攻击过,这会给网站带来很大损失,所以应该采取一些防御措施.下面就带大家来看看怎样防止服务器被攻击,常见的服务器攻击方式有哪些.     怎样防止服务器被攻击   1.关闭端口, ...

  5. 区块链攻击方式总结二

    目录 一.总述 二.第一个维度:双花攻击 1.51%算力攻击 (1)贿赂攻击 (2)币龄累计攻击 (3)通用挖矿攻击 2.芬尼攻击 3.种族攻击 4.分割攻击 5.重放攻击 (1)一条链上的重放攻击 ...

  6. 常见的Web攻击方式及对应防御

    Web攻击 XSS(跨站脚本攻击) CSRF(跨站请求伪造) Http Heads攻击 SQL 注入 DOS攻击(拒绝服务攻击) DDOS攻击 (分布式拒绝服务攻击) XSS(跨站脚本攻击) 简介: ...

  7. Web攻击常见攻击方式及防范方案

    Web攻击(WebAttack)是针对用户上网行为或网站服务器等设备进行攻击的行为,如植入恶意代码,修改网站权限,获取网站用户隐私信息等等,Web应用程序的安全性是任何基于Web业务的重要组成部分确保 ...

  8. 一种新的攻击方式:使用Outlook 表单进行横向渗透和常驻

    本文讲的是一种新的攻击方式:使用Outlook 表单进行横向渗透和常驻, 背景 最近我们针对CrowdStrike服务进行例行调查,发现了一种攻击方法,其主要用于横向渗透和系统常驻,而且是以前我们没有 ...

  9. 浅谈CSRF攻击方式

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

最新文章

  1. Flume-0.9.4数据插入HBase-0.96
  2. 编程界称霸全球的10大算法,你到底了解几个呢?
  3. VUE 笔记(持续更新中...)
  4. python操作excel表格-Python学习—对excel表格的操作
  5. 大快搜索城市运河大数据政务管理平台案例解读
  6. LeetCode之Remove Duplicates from Sorted Array
  7. 结构化日志:出错时你最想要的好朋友
  8. PO、VO、DAO、BO、POJO
  9. linux 迁移mysql目录_linux默认mysql迁移目录
  10. 这个游戏引擎开源了!
  11. android 小米读写权限,Android 小米手机的权限问题
  12. python 安全编码代码审计
  13. Monte Carlo(MC) Policy Evaluation 蒙特·卡罗尔策略评估
  14. 频繁gc是什么意思_linux查看是否频繁gc
  15. 学习CentOS6这一篇就够了
  16. 支付宝APP支付集成文档
  17. 在Java中将二进制数转化成十进制数
  18. UEStudio/UltraEdit 的语法高亮文件 (*.uew)
  19. 培训考试计算机系统,企业培训考试系统
  20. python统计字符串字符出现次数

热门文章

  1. 【2023年电工杯数学建模竞赛】选题分析+A题B题完整思路+代码分享
  2. Synergy 使用
  3. 力天创见区域客流人数统计
  4. 怎样计算权重?——层次分析法、熵值法:工具+数据+案例+代码
  5. 篱笆(Fenced In)
  6. 5G uRLLC技术及其与TSN的融合
  7. unity 获取两个向量夹角
  8. STM32F4深入学习【RCC】
  9. html文本隐藏内容占位,在HTML中如何隐藏某段文字具体该怎么实现文
  10. CAS . . . .