本文主要叙述在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 p−1的素因子
总之 ( 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) g≡hqp−1(mod p);其中 1 < h < p − 1 1<h<p-1 1<h<p−1
选择私钥 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) y≡gx(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)+x∗r)∗k−1(mod q)
签名结果为 ( r , s ) (r,s) (r,s)
w ≡ s − 1 ( m o d q ) w\equiv s^{-1}(mod~q) w≡s−1(mod q)
u 1 ≡ H ( m ) ∗ w ( m o d q ) u_1\equiv H(m)*w(mod~q) u1≡H(m)∗w(mod q)
u 2 ≡ r ∗ w ( m o d q ) u_2\equiv r*w(mod~q) u2≡r∗w(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≡(gu1∗yu2mod p)mod q
当 v = = r v==r v==r时,校验成功
一般的CTF题考察DSA算法,是求私钥 x x x
下面的例题来自CTF-wiki
根据 s ≡ ( H ( m ) + x ∗ r ) ∗ k − 1 ( m o d q ) s\equiv (H(m)+x*r)*k^{-1}(mod~q) s≡(H(m)+x∗r)∗k−1(mod q)
解得 x ≡ r − 1 ∗ ( k ∗ s − H ( m ) ) ( m o d q ) x\equiv r^{-1}*(k*s-H(m))(mod~q) x≡r−1∗(k∗s−H(m))(mod q)
在两次签名中共享 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)+x∗r)∗k−1(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)+x∗r)∗k−1(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) s1∗k≡H(m1)+x∗r(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) s2∗k≡H(m2)+x∗r(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∗(s1−s2)≡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))∗(s1−s2)−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算法