ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

DSA算法

2021-12-30 22:01:04  阅读:347  来源: 互联网

标签:CTF 2048 算法 DSA mod 256 equiv


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 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​∗yu2​mod 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)+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共享

在两次签名中共享 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算法

标签:CTF,2048,算法,DSA,mod,256,equiv
来源: https://blog.csdn.net/qq_51999772/article/details/122246171

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有