初闻不识曲中意,再听已是曲中人。
理论:
密钥生成
选取一个合适的哈希函数记为 $H$ 函数,例如
SHA1
。选择合适的密钥长度记$(L,N)$,其中DSS建议 $64|L$ ,且 $512≤L≤1024$,$N$ 不能大于 $H$ 函数输出的长度。
选取$N$ 比特的素数 $q$ 和 $L$ 比特的素数 $p$,并且满足 $q|(p-1)$ 。
选择满足模 $p$ 意义下阶为 $q$ 的整数 $g$ ,这里可以通过关系式
得出,其中 $1<h<p−1$ 。
- 选择整数 $x∈(0,q)$,记为私钥,并且计算 $y \equiv g^x \ mod \ p$。
- 最终公钥为 $(p,q,g,y)$,私钥为 $x$。
签名
- 选择临时密钥 $k$ ,满足 $0<k<q$。
- 计算 $r \equiv (g^k \ mod \ p)(mod \ q)$
- 计算 $s \equiv (H(m)+xr)k^{−1}(mod \ q)$
最终签名为 $(r,s)$
验签
1.设 $w \equiv s^{-1} \ mod \ q$ ,$u_1 \equiv H(m)w \ mod \ q$,$u_2 \equiv rw \ mod \ q$
2.设 $v \equiv g^{u_1}y^{u_2} \ mod \ p \ (mod \ q)$
3.若 $v=r$,则签名有效,否则则为非法签名。
代码
1 | def gen_key(): |
题目
2024i春秋夏季赛
signature
1 | import os |
题解
HNP
$s\equiv k^{-1}(H+xr) \bmod q $ ,变形为:
$k\equiv s^{-1}H+s^{-1}xr \bmod q$
令 $A = s^{-1}r \bmod q,B=s^{-1}H$
1 | a = inverse((S[i]), q) * (R[i]) % q |
即 $k_i\equiv A_ix+B_i \bmod q=>k_i=A_ix+B_i+l_iq $
构建lattice
:
但是 x 是160bit的,k是128bit的,K是k的上界,所以K取 $2^{128}$ ,也是128bit的,就不能直接算出 x
同时q也是160bit的,10行10列矩阵,所以n 是 10
数的大小
计算出的bit大小是:
$(160*8+128)/10=140.8 ~~bit$
所以我们需要处理一下,把 x 消掉来求解
Dexterjie 师傅 的做法如下:(膜拜)
$s_ik_i\equiv H_i+xr_i \bmod q=>s_ik_ir_0\equiv H_ir_0+xr_ir_0 \bmod q$
$s_0k_0\equiv H_0+xr_0 \bmod q=>s_0k_0r_i\equiv H_0r_i+xr_ir_0 \bmod q $
两式相减就消去 x 了
再转换成HNP的形式
$k_i=(r_0s_i)^{-1}(H_ir_0-H_0r_i)+(r_0s_i)^{-1}(r_is_0)k_0 \bmod q$
令 $A_i =(r_0s_i)^{-1}(r_is_0),B_i= (r_0s_i)^{-1}(H_ir_0-H_0r_i)$
再构造如上同样的格
exp:
想改一下的,但改无可改,proof过的比我的顺滑,数据接收处理的比我的好,再次膜拜Dexter佬
1 | import itertools |
非预期:
我们需要的是 含 admin 的 r,s
k 非必求项,题目直接给了 pri
exp:
1 | import hashlib |
body、babysign
2024 数字中国积分争夺赛 线下 半决赛 babysign
金砖北区 body
1 | from Crypto.Util.number import * |
最开始以为是 DSA + LFSR
,后面才知道是论文 DSA+LCG变形
《“Pseudo-Random” Number Generation within Cryptographic Algorithms: the DSS Case》
eg:
构建格:
则存在向量 $a=(k_1,k_2,x,j_1,j_2,j_3)$ ,使得 $a\times M = (m_1,m_2,b,k_1E_1,k_2E_2,xE_3) $
直接进行格基规约的话可能得不到想要的向量,因此设
$E_1 =\frac{1}{\gamma_1},E_2 =\frac{1}{\gamma_1},E_3 =\frac{1}{\gamma_2}$
其中 $\gamma_1 $ 是和 相同数量级的一个数,$\gamma_2$ 是和 x 相同数量级的一个数,这样就能够让 $k_1E_1,k_2E_2,xE_3$ 都趋向于 1,然后我们就再在这个规约后的格子上找一个 $(m_1,m_2,b,1,1,1)$ 的 CVP 就行了
题解:
回到本题
LCG变形:
利用上面的例子,我们可以去得到:
构建格:
1 | L = Matrix(QQ, |
则存在向量 $a=(k_0,k_1,k_2,k_3,k_4,k_5,x,j_0,j_1,j_2,j_3,j_4,j_5,j_6,j_7,j_8)$ ,使得 $a\times M = (m_0,m_1,m_2,m_3,m_4,m_5,c_0,c_0,c_0,k_0E_1,k_1E_1,k_2E_1,k_3E_1,k_4E_1,,k_5E_1,xE_2) $
因为 x ,也即 sk 是 200 bit 的,k ,也即 nonce 是 320 bit 的 ,所以对应调一下
$E_1 = \frac{1}{2^{320}},E_2 = \frac{1}{2^{200}} $
然后利用LLL算法和Babai最近平面算法,可以在多项式时间内找到SVP近似解。
也就是上述的找一个 $(m_0,m_1,m_2,m_3,m_4,m_5,c_0,c_0,c_0,1,1,1,1,1,1,1)$ 的 CVP
exp:
1 | from Crypto.Util.number import * |
DAS_DSA
DDAASSSAA.py
1 | from Crypto.Util.number import * |
task.py
1 | import random |
GIFT.txt
1 | SDSSDASSAAASSDADSASADASSSSADDS |
enc.txt
1 | (59254487398967388114905667045028363843329923626238494813205814542210325221866, 38134152657262330507433713437784426184950965354807113354631630191330303144120) |
31 组 r,s,典型 HNP
,不过直接 规约不出来
这里 key 的构成已知,无非 “DAS” 可重复组合
可以接受爆破 key 的高位
已知 k 的高位
直接拿上面的下来:
最后会得到
令 $A_i=(r_0s_i)^{-1}(r_is_0) \pmod q$
HNP
的形式就出来了
exp:
1 | from Crypto.Util.Padding import pad |
已知 k 的低位
同理,爆破 k 的低位也是可以接受的
最后会得到
1 | n = len(R) |
已知 k 的高位和低位
同理,这里也不是不能接受。。。
HNP
补充
2024-08-06
注意 构建矩阵的时候,矩阵类型就变成 QQ
了,(报错原因找到了🥲)
1 | L = Matrix(QQ, n + 2, n + 2) |
细节就需要自己去test了😊😊
dsa常见题型:
DSA数字签名 | DexterJie’Blog
reference:
【星盟安全】2024年春秋杯夏季赛密码讲解_哔哩哔哩_bilibili
浅尝 Lattice 之 HNP-安全客 - 安全资讯平台 (anquanke.com)
2024 数字中国积分争夺赛 线下