西湖论剑_unknown_dsa_复现

unknown_dsa

题目描述

from Crypto.Util.number import *
from Crypto.PublicKey import DSA
from Crypto.Hash import SHA
from gmpy2 import invert,powmod
import random
from secret import flag,m1,m2,ul,vl,wl

def encrypt():
    key = DSA.generate(int(1024))
    q = key.q
    p = key.p
    g = key.g
    x1 = bytes_to_long(flag[:len(flag)//2])
    x2 = bytes_to_long(flag[len(flag)//2:])
    assert x1<q and x2<q
    t = powmod(g, p*q-(p+q), p*q)
    hm1 = bytes_to_long(SHA.new(m1).digest())
    hm2 = bytes_to_long(SHA.new(m2).digest())
    k = random.randint(1, q-1)
    r1 = powmod(g, k, p) % q
    s1 = (hm1 + x1*r1) * invert(k, q) % q
    s2 = (hm2 + x1*r1) * invert(k, q) % q
    r2 = powmod(g, x1, p) % q
    s3 = (hm1 + x2*r2) * invert(k, q) % q
    print(p*q, (p-1)//q, t, sep=', ')
    print(r1, s1, s2, sep=', ')
    print(r2, s3, sep=', ')

def main():
    for i in range(len(ul)):
        assert ul[i]**2 - wl[i]* vl[i]**2==1
    e = 7
    cl1 = [int(powmod(bytes_to_long(m1), e, x)) for x in ul]
    cl2 = [int(powmod(bytes_to_long(m2), e, y)) for y in vl]
    print(wl, cl1, cl2, sep=', ')
    
    encrypt()

if __name__ == '__main__':
    main()

'''
[3912956711, 4013184893, 3260747771], [2852589223779928796266540600421678790889067284911682578924216186052590393595645322161563386615512475256726384365091711034449682791268994623758937752874750918200961888997082477100811025721898720783666868623498246219677221106227660895519058631965055790709130207760704, 21115849906180139656310664607458425637670520081983248258984166026222898753505008904136688820075720411004158264138659762101873588583686473388951744733936769732617279649797085152057880233721961, 301899179092185964785847705166950181255677272294377823045011205035318463496682788289651177635341894308537787449148199583490117059526971759804426977947952721266880757177055335088777693134693713345640206540670123872210178680306100865355059146219281124303460105424], [148052450029409767056623510365366602228778431569288407577131980435074529632715014971133452626021226944632282479312378667353792117133452069972334169386837227285924011187035671874758901028719505163887789382835770664218045743465222788859258272826217869877607314144, 1643631850318055151946938381389671039738824953272816402371095118047179758846703070931850238668262625444826564833452294807110544441537830199752050040697440948146092723713661125309994275256, 10949587016016795940445976198460149258144635366996455598605244743540728764635947061037779912661207322820180541114179612916018317600403816027703391110922112311910900034442340387304006761589708943814396303183085858356961537279163175384848010568152485779372842]
85198615386075607567070020969981777827671873654631200472078241980737834438897900146248840279191139156416537108399682874370629888207334506237040017838313558911275073904148451540255705818477581182866269413018263079858680221647341680762989080418039972704759003343616652475438155806858735982352930771244880990190318526933267455248913782297991685041187565140859, 106239950213206316301683907545763916336055243955706210944736472425965200103461421781804731678430116333702099777855279469137219165293725500887590280355973107580745212368937514070059991848948031718253804694621821734957604838125210951711527151265000736896607029198, 60132176395922896902518845244051065417143507550519860211077965501783315971109433544482411208238485135554065241864956361676878220342500208011089383751225437417049893725546176799417188875972677293680033005399883113531193705353404892141811493415079755456185858889801456386910892239869732805273879281094613329645326287205736614546311143635580051444446576104548
498841194617327650445431051685964174399227739376, 376599166921876118994132185660203151983500670896, 187705159843973102963593151204361139335048329243
620827881415493136309071302986914844220776856282, 674735360250004315267988424435741132047607535029
'''

涉及的知识点按解题顺序有Pell方程中国剩余定理模数不互素的情况DSA算法以及k共享情况

Pell方程

(10条消息) Pell方程_M3ng@L的博客-CSDN博客

首先通过求解Pell方程来算得vl,ul;也就是在之后RSA加密中使用的模数

中国剩余定理模数不互素的情况

(10条消息) 中国剩余定理模数不互素的情况_M3ng@L的博客-CSDN博客

这里使用低加密指数广播攻击,且模数不互素,推导过程在上面这篇文章中

可以算得消息 m 1 , m 2 m_1,m_2 m1,m2

这样就可以知道稍后在DSA算法中用到得 H ( m 1 ) , H ( m 2 ) H(m_1),H(m_2) H(m1),H(m2)

DSA算法

(10条消息) DSA算法_M3ng@L的博客-CSDN博客

先求 q q q

由于已知 p ∗ q p*q pq ( p − 1 ) / / q (p-1)//q (p1)//q

两者相乘得到 p ∗ ( p − 1 ) p*(p-1) p(p1)在对这个一元二次方程求解即可得到 p p p

那么 q q q​也可以得到

有三组DSA算法

其中两组使用了相同的 r 1 , k , x 1 r1,k,x1 r1,k,x1​​

使用k共享的攻击方式,通过 k = ( H ( m 1 ) − H ( m 2 ) ) ∗ ( s 1 − s 2 ) − 1 ( m o d   q ) k=(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 , r 1 , s 1 , s 2 k,r1,s1,s2 k,r1,s1,s2​​​​​已知,可以通过同余式 x 1 ≡ r 1 − 1 ∗ ( k ∗ s 1 − H ( m 1 ) ) ( m o d   q ) x1\equiv r1^{-1}*(k*s1-H(m1))(mod~q) x1r11(ks1H(m1))(mod q)​​​​求得 x 1 x1 x1​​​​​

剩下的一组也是使用的相同的 k k k

由于 r 2 , s 3 r2,s3 r2,s3​已知,那么可以求得 x 2 x2 x2

整道题的代码实现

from Crypto.Util.number import *
import gmpy2,sympy
from Crypto.Hash import SHA

wl = [3912956711, 4013184893, 3260747771]
cl1 = [2852589223779928796266540600421678790889067284911682578924216186052590393595645322161563386615512475256726384365091711034449682791268994623758937752874750918200961888997082477100811025721898720783666868623498246219677221106227660895519058631965055790709130207760704, 21115849906180139656310664607458425637670520081983248258984166026222898753505008904136688820075720411004158264138659762101873588583686473388951744733936769732617279649797085152057880233721961, 301899179092185964785847705166950181255677272294377823045011205035318463496682788289651177635341894308537787449148199583490117059526971759804426977947952721266880757177055335088777693134693713345640206540670123872210178680306100865355059146219281124303460105424] 
cl2 = [148052450029409767056623510365366602228778431569288407577131980435074529632715014971133452626021226944632282479312378667353792117133452069972334169386837227285924011187035671874758901028719505163887789382835770664218045743465222788859258272826217869877607314144, 1643631850318055151946938381389671039738824953272816402371095118047179758846703070931850238668262625444826564833452294807110544441537830199752050040697440948146092723713661125309994275256, 10949587016016795940445976198460149258144635366996455598605244743540728764635947061037779912661207322820180541114179612916018317600403816027703391110922112311910900034442340387304006761589708943814396303183085858356961537279163175384848010568152485779372842]
pq1 = 85198615386075607567070020969981777827671873654631200472078241980737834438897900146248840279191139156416537108399682874370629888207334506237040017838313558911275073904148451540255705818477581182866269413018263079858680221647341680762989080418039972704759003343616652475438155806858735982352930771244880990190318526933267455248913782297991685041187565140859
pq2 = 106239950213206316301683907545763916336055243955706210944736472425965200103461421781804731678430116333702099777855279469137219165293725500887590280355973107580745212368937514070059991848948031718253804694621821734957604838125210951711527151265000736896607029198
t = 60132176395922896902518845244051065417143507550519860211077965501783315971109433544482411208238485135554065241864956361676878220342500208011089383751225437417049893725546176799417188875972677293680033005399883113531193705353404892141811493415079755456185858889801456386910892239869732805273879281094613329645326287205736614546311143635580051444446576104548
r1,s1,s2 = 498841194617327650445431051685964174399227739376, 376599166921876118994132185660203151983500670896, 187705159843973102963593151204361139335048329243
r2,s3 = 620827881415493136309071302986914844220776856282, 674735360250004315267988424435741132047607535029


# Pell方程求解部分
# sagemath
# def Pell(D,trynumber = 1000):
#     temp = continued_fraction(sqrt(D))
#     for i in range(trynumber):
#         denom = temp.denominator(i)
#         num = temp.numerator(i)
#         if num^2- D * denom^2 == 1:
#             return num,denom
#     return None,None
# for i in wl:
#     Pell(i)
# (10537190383977432819948602717449313819513015810464463348450662860435011008001132238851729268032889296600248226221086420035262540732157097949791756421026015741477785995033447663038515248071740991264311479066137102975721041822067496462240009190564238288281272874966280,168450500310972930707208583777353845862723614274337696968629340838437927919365973736431467737825931894403582133125917579196621697175572833671789075169621831768398654909584273636143519940165648838850012943578686057625415421266321405275952938776845012046586285747)
# (121723653124334943327337351369224143389428692536182586690052931548156177466437320964701609590004825981378294358781446032392886186351422728173975231719924841105480990927174913175897972732532233,1921455776649552079281304558665818887261070948261008212148121820969448652705855804423423681848341600084863078530401518931263150887409200101780191600802601105030806253998955929263882382004)
# (1440176324831562539183617425199117363244429114385437232965257039323873256269894716229817484088631407074328498896710966713912857642565350306252498754145253802734893404773499918668829576304890397994277568525506501428687843547083479356423917301477033624346211335450,25220695816897075916217095856631009012504127590059436393692101250418226097323331193222730091563032067314889286051745468263446649323295355350101318199942950223572194027189199046045156046295274639977052585768365501640340023356756783359924935106074017605019787)


# 中国剩余定理模数不互素部分求解
ml1 = [10537190383977432819948602717449313819513015810464463348450662860435011008001132238851729268032889296600248226221086420035262540732157097949791756421026015741477785995033447663038515248071740991264311479066137102975721041822067496462240009190564238288281272874966280,121723653124334943327337351369224143389428692536182586690052931548156177466437320964701609590004825981378294358781446032392886186351422728173975231719924841105480990927174913175897972732532233,1440176324831562539183617425199117363244429114385437232965257039323873256269894716229817484088631407074328498896710966713912857642565350306252498754145253802734893404773499918668829576304890397994277568525506501428687843547083479356423917301477033624346211335450]
ml2 = [168450500310972930707208583777353845862723614274337696968629340838437927919365973736431467737825931894403582133125917579196621697175572833671789075169621831768398654909584273636143519940165648838850012943578686057625415421266321405275952938776845012046586285747,1921455776649552079281304558665818887261070948261008212148121820969448652705855804423423681848341600084863078530401518931263150887409200101780191600802601105030806253998955929263882382004,25220695816897075916217095856631009012504127590059436393692101250418226097323331193222730091563032067314889286051745468263446649323295355350101318199942950223572194027189199046045156046295274639977052585768365501640340023356756783359924935106074017605019787]
cl1 = [2852589223779928796266540600421678790889067284911682578924216186052590393595645322161563386615512475256726384365091711034449682791268994623758937752874750918200961888997082477100811025721898720783666868623498246219677221106227660895519058631965055790709130207760704, 21115849906180139656310664607458425637670520081983248258984166026222898753505008904136688820075720411004158264138659762101873588583686473388951744733936769732617279649797085152057880233721961, 301899179092185964785847705166950181255677272294377823045011205035318463496682788289651177635341894308537787449148199583490117059526971759804426977947952721266880757177055335088777693134693713345640206540670123872210178680306100865355059146219281124303460105424] 
cl2 = [148052450029409767056623510365366602228778431569288407577131980435074529632715014971133452626021226944632282479312378667353792117133452069972334169386837227285924011187035671874758901028719505163887789382835770664218045743465222788859258272826217869877607314144, 1643631850318055151946938381389671039738824953272816402371095118047179758846703070931850238668262625444826564833452294807110544441537830199752050040697440948146092723713661125309994275256, 10949587016016795940445976198460149258144635366996455598605244743540728764635947061037779912661207322820180541114179612916018317600403816027703391110922112311910900034442340387304006761589708943814396303183085858356961537279163175384848010568152485779372842]

i = 0
def CRT(cl,ml):
    global i
    clist = cl
    moudlelist = ml
    if i == 0:
        m1,m2 = ml[i],ml[i+1]
        c1,c2 = cl[i],cl[i+1]
    else:
        m1,m2 = ml[i],ml[len(ml)-1]
        c1,c2 = cl[i],cl[len(cl)-1]
    d = gmpy2.gcd(m1,m2)
    print(d)
    c = c2 - c1
    assert c % d == 0
    # X = c // d * gmpy2.invert(m1 // d,m2 // d)
    _,k1,k2 = gmpy2.gcdext(m1,m2) 
    X = c // d * k1 * m1
    if i == 0:
        clist.append((X + c1) % gmpy2.lcm(m1,m2))
        # moudlelist.append(m1*m2 // d)
        moudlelist.append(gmpy2.lcm(m1,m2))
        i += 2
    else:
        clist[len(clist)-1] = (X + c1) % gmpy2.lcm(m1,m2)
        # moudlelist[len(moudlelist)-1] = m1*m2 // d
        moudlelist[len(moudlelist)-1] = gmpy2.lcm(m1,m2)
        i += 1
    return clist,moudlelist


ii = 3
temp_cl,temp_ml = CRT(cl1,ml1)
while len(cl1) - ii > 0:
    temp_cl,temp_ml = CRT(temp_cl,temp_ml)
    ii += 1
final_c = temp_cl[len(temp_cl)-1]
m1 = long_to_bytes(gmpy2.iroot(final_c,7)[0])
print(long_to_bytes(gmpy2.iroot(final_c,7)[0]))
ii = 3
i = 0
temp_cl,temp_ml = CRT(cl2,ml2)
while len(cl2) - ii > 0:
    temp_cl,temp_ml = CRT(temp_cl,temp_ml)
    ii += 1
final_c = temp_cl[len(temp_cl)-1]
m2 = long_to_bytes(gmpy2.iroot(final_c,7)[0])
print(long_to_bytes(gmpy2.iroot(final_c,7)[0]))


# DES算法求解部分
hm1 = bytes_to_long(SHA.new(m1).digest())
hm2 = bytes_to_long(SHA.new(m2).digest())

# sagemath
# temp = pq1 * pq2
# p = var('p')
# solve([p*(p-1)==temp],p)
p = 95139353880772104939870618145448234251031105153406565833029787299040378395002190438381537974853777890692924407167823818980082672873538133127131356810153012924025270883966172420658777903337576027105954119811495411149092960422055445121097259802686960288258399754185484307350305454788837702363971523085335074839
q = pq1 // p
re_s12 = gmpy2.invert(s1-s2,q)
k = (hm1 - hm2) * re_s12 % q

re_r1 = gmpy2.invert(r1,q)
x1 = re_r1 * (k*s1 - hm1) % q
re_r2 = gmpy2.invert(r2,q)
x2 = re_r2 * (k*s3 - hm1) % q
print(bytes.decode(long_to_bytes(x1)),end="")
print(bytes.decode(long_to_bytes(x2)))

参考文章

2021年西湖论剑网络安全技能大赛部分WP - 安全客,安全资讯平台 (anquanke.com)

  • 0
    点赞
  • 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、付费专栏及课程。

余额充值