DSA算法

DSA

本文主要叙述在CTF中的DSA,根据我自己的理解重述一遍CTF-wiki对DSA的描述

公私钥的生成

  • 选择一个哈希函数 H ( ) H() H();一般选作SHA1

  • 选择比特数为 64 64 64​的倍数的素数 p p p​​,且位数处于 512 512 512​到 1024 1024 1024​之间

  • 选择 160 b i t s 160bits 160bits​​的素数 q q q​(这里对 q q q的大小限制准确来说是不大于哈希函数H输出的长度),满足 q q q p − 1 p-1 p1​的素因子

总之 ( p , q ) (p,q) (p,q)的大小一般是 ( 1024 , 160 ) , ( 2048 , 224 ) , ( 2048 , 256 ) (1024,160),(2048,224),(2048,256) (1024,160),(2048,224),(2048,256)以及 ( 3072 , 256 ) (3072,256) (3072,256)​,单位比特

  • 选择满足 g ≡ h p − 1 q ( m o d   p ) g\equiv h^{\frac{p-1}{q}}(mod~p) ghqp1(mod p)​;其中 1 < h < p − 1 1<h<p-1 1<h<p1​​

  • 选择私钥 x x x 0 < x < q 0<x<q 0<x<q,计算 y ≡ g x ( m o d   p ) y\equiv g^x(mod~p) ygx(mod p)

公钥为 ( p , q , g , y ) (p,q,g,y) (p,q,g,y)

私钥为 ( x ) (x) (x)

数字签名

选择随机整数 k k k作为临时密钥, 0 < k < q 0<k<q 0<k<q

r ≡ ( g k   m o d   p ) m o d   q r\equiv (g^k~mod~p)mod~q r(gk mod p)mod q

s ≡ ( H ( m ) + x ∗ r ) ∗ k − 1 ( m o d   q ) s\equiv (H(m)+x*r)*k^{-1}(mod~q) s(H(m)+xr)k1(mod q)

签名结果为 ( r , s ) (r,s) (r,s)

验证

w ≡ s − 1 ( m o d   q ) w\equiv s^{-1}(mod~q) ws1(mod q)

u 1 ≡ H ( m ) ∗ w ( m o d   q ) u_1\equiv H(m)*w(mod~q) u1H(m)w(mod q)

u 2 ≡ r ∗ w ( m o d   q ) u_2\equiv r*w(mod~q) u2rw(mod q)

v ≡ ( g u 1 ∗ y u 2 m o d   p ) m o d   q v\equiv (g^{u_1}*y^{u_2}mod~p)mod~q v(gu1yu2mod p)mod q

v = = r v==r v==r时,校验成功

CTF应用

一般的CTF题考察DSA算法,是求私钥 x x x

下面的例题来自CTF-wiki

  • 已知随机密钥 k k k

根据 s ≡ ( H ( m ) + x ∗ r ) ∗ k − 1 ( m o d   q ) s\equiv (H(m)+x*r)*k^{-1}(mod~q) s(H(m)+xr)k1(mod q)

解得 x ≡ r − 1 ∗ ( k ∗ s − H ( m ) ) ( m o d   q ) x\equiv r^{-1}*(k*s-H(m))(mod~q) xr1(ksH(m))(mod q)

  • k k k共享

在两次签名中共享 k k k

签名消息为 m 1 , m 2 m_1,m_2 m1,m2

s 1 ≡ ( H ( m 1 ) + x ∗ r ) ∗ k − 1 ( m o d   q ) s_1\equiv(H(m_1)+x*r)*k^{-1}(mod~q) s1(H(m1)+xr)k1(mod q)

s 2 ≡ ( H ( m 2 ) + x ∗ r ) ∗ k − 1 ( m o d   q ) s_2\equiv(H(m_2)+x*r)*k^{-1}(mod~q) s2(H(m2)+xr)k1(mod q)

推导

s 1 ∗ k ≡ H ( m 1 ) + x ∗ r ( m o d   q ) s_1*k\equiv H(m_1)+x*r(mod~q) s1kH(m1)+xr(mod q)

s 2 ∗ k ≡ H ( m 2 ) + x ∗ r ( m o d   q ) s_2*k\equiv H(m_2)+x*r(mod~q) s2kH(m2)+xr(mod q)

相减得到

k ∗ ( s 1 − s 2 ) ≡ H ( m 1 ) − H ( m 2 ) ( m o d   q ) k*(s_1-s_2)\equiv H(m_1)-H(m_2)(mod~q) k(s1s2)H(m1)H(m2)(mod q)

求逆元

k ≡ ( H ( m 1 ) − H ( m 2 ) ) ∗ ( s 1 − s 2 ) − 1 ( m o d   q ) k\equiv (H(m_1)-H(m_2))*(s_1-s_2)^{-1}(mod~q) k(H(m1)H(m2))(s1s2)1(mod q)

已知 k k k之后重复已知密钥 k k k的解密过程即可

参考文章

DSA - CTF Wiki (ctf-wiki.org)

(11条消息) DSA加密算法以及破解_happend的博客-CSDN博客_dsa加密算法

(11条消息) DSA-数据签名算法(理论)_aaqian1的博客-CSDN博客_dsa算法

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M3ng@L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值