首页 自述 友链 开往

文章

数字签名

Elgamal

基本原理

密钥生成

  • 选取一个足够大的素数 p(十进制位数不低于 160),以便于在ZpZ_pZp​上求解离散对数问题是困难的。
  • 选取Zp\*Z^\*_pZp\*​的生成元 g。(通常是g是p的原根)
  • 选择一个私钥d,满足 1<d<p−1 1<d<p−1 1<d<p−1
  • 计算y=gdmod py=g^dmod\ py=gdmod p
  • 公钥为(p,g,y)(p,g,y)(p,g,y),私钥为(d)(d)(d)。

签名

  • 随机生成k,0<k<p0<k<p0<k<p,满足gcd(k,p−1)=1gcd(k,p-1)=1gcd(k,p−1)=1
  • 计算r=gkmod pr=g^kmod\ pr=gkmod p
  • 计算s=(H(m)−dr)k−1mod p−1s=(H(m)-dr)k^{-1}mod\ p-1s=(H(m)−dr)k−1mod p−1
  • 返回(r,s)(r,s)(r,s)和H(m)H(m)H(m),若是明文m则存在伪造签名的可能

验签

  • 验证gH(m)≡yrrsmod pg^{H(m)}\equiv y^rr^smod\ pgH(m)≡yrrsmod p

攻击方式

验签漏洞,未校验r和s的大小

[0xGame 2024]Elgamal

已知gh≡yrrsmod p已知g^h\equiv y^rr^smod\ p已知gh≡yrrsmod p

构造h’,(r’,s’) St. gh’≡yr’r’s’mod p构造h’,(r’,s’)\ St.\ g^{h’}\equiv y^{r’}r’^{s’}mod\ p构造h’,(r’,s’) St. gh’≡yr’r’s’mod p

∃h’=kh mod (p−1)\exists h’ = kh\ mod\ (p-1)∃h’=kh mod (p−1)

gm’≡gkm≡yr’r’s’≡ykrrksmod pg^{m’}\equiv g^{km}\equiv y^{r’}r’^{s’}\equiv y^{kr}r^{ks}mod\ pgm’≡gkm≡yr’r’s’≡ykrrksmod p

\left\{\begin{align}r’&=kr\ mod\ p-1 \\ r’&=r\ \ \ mod\ p\end{align}\right.

\Rightarrow \left\{\begin{align}r’&=crt(\[kr,r\],\[p-1,p\]) \\ s’&=ks\end{align}\right.

DSA数字签名

基本原理

密钥生成

  • 选择一个哈希函数H(m)H(m)H(m),一般使用SHA1
  • 确定长度N1N_1N1​和N2N_2N2​,使得N2N_2N2​不大于哈希长度
  • 依据N1N_1N1​和N2N_2N2​作为比特长度生成ppp和qqq,满足gcd(p−1,q)=qgcd(p-1,q)=qgcd(p−1,q)=q
  • 选择满足gk≡1 mod pg^k\equiv 1\ mod\ pgk≡1 mod p的最小正整数k为q的g,即在模p的背景下,ord(g)=qord(g)=qord(g)=q。即g在模p的意义下,其指数次幂可以生成具有q个元素的子群。这里,我们可以通过计算g=hp−1qmod pg=h^{\frac{p-1}{q}}mod\ pg=hqp−1​mod p来得到g,其中1<h<p−11<h<p-11<h<p−1.
  • 选择私钥d,0<d<q0<d<q0<d<q,计算y≡gdmod py\equiv g^dmod\ py≡gdmod p。
  • 公钥为(p,q,g,y)(p,q,g,y)(p,q,g,y),私钥为(d)(d)(d)。

签名

  • 随机生成k,0<k<q0<k<q0<k<q
  • 计算r=(gkmod p)mod qr=(g^kmod\ p)mod\ qr=(gkmod p)mod q
  • 计算s=(H(m)+dr)k−1mod qs=(H(m)+dr)k^{-1}mod\ qs=(H(m)+dr)k−1mod q
  • 返回(r,s)(r,s)(r,s)和H(m)H(m)H(m)

验签

  • 计算u1=H(m)s−1 mod qu_1=H(m)s^{-1}\ mod\ qu1​=H(m)s−1 mod q
  • 计算u2=rs−1 mod qu_2=rs^{-1}\ mod\ qu2​=rs−1 mod q
  • 验证r=(gu1yu2mod p)mod qr=(g^{u_1}y^{u_2}mod\ p)mod\ qr=(gu1​yu2​mod p)mod q

攻击方式

已知k

d=(ks−H(m))r−1mod qd=(ks-H(m))r^{-1}mod\ qd=(ks−H(m))r−1mod q

复用k攻击

{s1=(H(m1)+dr)k−1mod qs2=(H(m2)+dr)k−1mod q\left\{\begin{matrix}s_1=(H(m_1)+dr)k^{-1}mod\ q\\s_2=(H(m_2)+dr)k^{-1}mod\ q\end{matrix}\right.{s1​=(H(m1​)+dr)k−1mod qs2​=(H(m2​)+dr)k−1mod q​

k=(H(m1)−H(m2))(s1−s2)−1mod qk=(H(m_1)-H(m_2))(s_1-s_2)^{-1}mod\ qk=(H(m1​)−H(m2​))(s1​−s2​)−1mod q

线性k攻击

\left\{\begin{align}s_1&=(H(m_1)+d_1r)k^{-1}mod\ q \\ s_2&=(H(m_2)+d_2r)(ak+b)^{-1}mod\ q\end{align}\right.

\left\{\begin{align}ks_1r_2\equiv h_1r_2+xr_1r_2\ mod\ q \\ (ak+b)s_2r_1\equiv h_2r_1+xr_1r_2\ mod\ q\end{align}\right.

k=(h1r2−h2r1+bs2r1)(s1r2−as2r1)−1mod qk=(h_1r_2-h_2r_1+bs_2r_1)(s_1r_2-as_2r_1)^{-1}mod\ qk=(h1​r2​−h2​r1​+bs2​r1​)(s1​r2​−as2​r1​)−1mod q

二次k攻击

[国城杯 2024]Ez_sign

k2=k12,可以看作a=k,b=0k_2=k_1^2,可以看作a=k,b=0k2​=k12​,可以看作a=k,b=0

k2s2r1−ks1r2+h1r2−h2r1=0 mod qk^2s_2r_1-ks_1r_2+h_1r_2-h_2r_1=0\ mod\ qk2s2​r1​−ks1​r2​+h1​r2​−h2​r1​=0 mod q

用Sage求解一元二次方程在有限域上的整数解

R.<k> = PolynomialRing(Zmod(q))
f = k^2*r1*s2 - k*r2*s1 - H2*r1 + H1*r2
roots=f.roots()
print(roots)

for i in roots:
    k = i[0]
    d = (k*s1-H1)*pow(r1,-1,q)%q
    if y == pow(g,d,p):
        print(k,d)
        break

0 条评论