2023陕西省赛-Crypto

3 篇文章 0 订阅
1 篇文章 0 订阅

奇怪的sar

解题思路:根据线性同余去求出a,b,继而求出seed

import gmpy2
from gmpy2 import *
from Crypto.Util.number import *
n =  24044063028844014127418595700558729326190738802687551098858513077613750188240082663594575453404975706225242363463089392757425008423696150244560748490108425645064339883915929498539109384801415313004805586193044292137299902797522618277016789979196782551492020031695781792205215671106103568559626617762521687128199445018651010056934305055040748892733145467040663073395258760159451903432330506383025685265502086582538667772105057401245864822281535425692919273252955571196166824113519446568745718898654447958192533288063735350717599092500158028352667339959012630051251024677881674246253876293205648190626145653304572328397
seed = 39428646082513135314545544161912595458975375891528176714825766497155482031976852156313956476772023258684487799640179241987139554034654104867011313090105438798561154654679825702410748780286094326639330840289843154525176685892323447168072417654823748596238888125898914210332775882916911771786984574407163323116
c =  14883053247652228283811442762780942186987432684268901119544211089991663825267989728286381980568977804079766160707988623895155236079459150322336701772385709429870215701045797411519212730389048862111088898917402253368572002593328131895422933030329446097639972123501482601377059155708292321789694103528266681104521268192526745361895856566384239849048923482217529011549596939269967690907738755747213669693953769070736092857407573675987242774763239531688324956444305397953424851627349331117467417542814921554060612622936755420459029769026126293588814831034143264949347763031994934813475762839410192390466491651507733968227
m =  137670797028117726329534659376416493367957852768263083700434198723955223922183386928456013703791817601151754417828367188186912209697081337658512940425529211281290630976671911327606706953154608427885071841566358882014021242768190762103365969320014710368160869517966437591299370072284930202718943785099916898209
enc=  [101737402423360536260958229788866250367716256968287178187558336481872788309727545478736771692477306412259739856568227009850831432381180909815512654609798228982433082928392936844193974517574281026029228179913579225687286945054175762659252515268270399329404664775893089132101252158524000295899895962104782878103,
        37355684997487259669354747104430314505839306993101096210478266975184357608742619438151118843905165289324251734149329596611854110739738607745107961453008343886403511257039401245484528985856920723694142989180291902939107642020398816995584650913417698279936585230648639613028793148102494100898288564799111024672,
        58677759595639211550435023449462812079890625834313820227189340593596480924226619376872336960357021314847975570175387751632125898437020801920862764666175594874885587518469384576361008639967382152477408865298759987606155830674598034578657554841283906976808719095766296677147076808250022898199866472085742989883,
        61841632061818470036288407041172200048676249787061823756736224887116113640875444187463656719652972233582538657844183320242896612625995507633237074900538692102956750184024574603018257213912795847625926653585010890014291951218199774765624860625726555381815237888483974246173727262881650634287497285246796321130,
        7618244158597756867387754433401378508070531356170836765779245254233413235386172690733378371343899289510629513166609513857423499004879497768588665836034791151090648182168421570449377835494883902907064269417199065924565304966242954268460876762295575715334403142360198583318323418975108290758222653083011275844,
        106276841058222138994123556391380518368163552919305398852484130331884811278068151915582752795463570013359693610495645946230044828403849434903415989487924763756589202218361370725532394478569304449884620166937809374355282324069422109879874964479199929174533104879048175102339134830614476339153367475243140156049,
        54574757236475194407137831004617398270525645136836468973535243574661043352422598443323384197261529289829451787586618886007968913414366545291507686451774653217577858375086817168124727394445167274831801876424578654786480330913650363551771258617533162477541882336257099777912519011890593910515860435759936717781,
        15567087904962670212229825713697043597876172881256160613623383896576159414077875401117959132252949501643234465895697270909085179587988268864498823765197994781747034644583869111599516151129007414228897958635533561248099927507725880289417298814703767549313482346652043188826434944367260731729064673486516315207,
        10757138067445225320504771816863593606847219020279502671965413470243269270456133564739090471033889069283122519782525412134604896073598293410977787230108853737796640474070194546344190858079847734817109910030714675258996740807873872365037296486121580542250452443305370358407408558223735250474249180772656905880,
        68097848963949068260912124852455363245291187860801223898468533992003737157497436432969031551088942445561676359631354280979357356539429863946694570097104716411407829017684705171462511875250672979623888463245258237680782731827727876526411531354910982579164963119481534453651300645314177478026462894232377307020]
e = 65537
# a = (enc[3] - enc[2]) * invert(enc[2] - enc[1] , m) % m
# b = (enc[3] - enc[2] * a) % m
# a_1 = invert(a,m)
# print(a)
# print(b)
# seed = ((enc[0]-b)*a_1)%m
# print(seed)

temp = gmpy2.invert(enc[0]-enc[1], m)
b = ((enc[0]*enc[2]-enc[1]**2)*temp)%m
print(b)
enc_0 = gmpy2.invert(enc[0], m)
a = ((enc[1]-b)*enc_0)%m
print(a)
a_ = gmpy2.invert(a,m)  # 求a逆元
seed = ((enc[0]-b)*a_)%m
print(seed)

发现题目给出P^q,是关联爆破,然后找了个脚本,在sage上跑一下求出p(若想进一步了解关联爆破,移步到以下网站:关联爆破-RSA分解_石氏是时试的博客-CSDN博客

# sage
N = 24044063028844014127418595700558729326190738802687551098858513077613750188240082663594575453404975706225242363463089392757425008423696150244560748490108425645064339883915929498539109384801415313004805586193044292137299902797522618277016789979196782551492020031695781792205215671106103568559626617762521687128199445018651010056934305055040748892733145467040663073395258760159451903432330506383025685265502086582538667772105057401245864822281535425692919273252955571196166824113519446568745718898654447958192533288063735350717599092500158028352667339959012630051251024677881674246253876293205648190626145653304572328397
gift = 39428646082513135314545544161912595458975375891528176714825766497155482031976852156313956476772023258684487799640179241987139554034654104867011313090105438798561154654679825702410748780286094326639330840289843154525176685892323447168072417654823748596238888125898914210332775882916911771786984574407163323116

PR.<x>= PolynomialRing(Zmod(N))
ok = False

def pq_xor(tp, tq, idx):
    global ok

    if ok:
        return 
    if tp * tq > N:
        return
    if (tp + (2 << idx)) * (tq + (2 << idx)) < N:
        return

    if idx <= 400:
        try:
            f = tp + x
            rr = f.monic().small_roots(X=2 ^ 400, beta=0.4)
            if rr != []:
                print(rr)
                print(tp)
                print('p = ', f(rr[0]))
                ok = True
                return 
        except:
            pass

        return 

    idx -= 1
    b = (gift >> idx) & 1
    one = 1 << idx
    if b == 0:
        pq_xor(tp, tq, idx)
        pq_xor(tp + one, tq + one, idx)
    else:  # 1
        pq_xor(tp + one, tq, idx)
        pq_xor(tp, tq + one, idx)


# N.nbits()=2048 gift.nbits()=1023  p,q的1024位为1
tp = 1 << 1023
tq = 1 << 1023
pq_xor(tp, tq, 1023)

最后解出m

p = 175909504894211247364395617174091428768974985846552891279489073681785877028619520625043017232062800318796180901847503827906224008040782018396669843628458963255715414759414738416930428210387093039711088082737992450479987000339480311499183821667504225082440337907962316839883506834373795587694663967806384498129
q = n//p
phi = (p-1)*(q-1)

e = 65537
d = invert(e,phi)
c = 14883053247652228283811442762780942186987432684268901119544211089991663825267989728286381980568977804079766160707988623895155236079459150322336701772385709429870215701045797411519212730389048862111088898917402253368572002593328131895422933030329446097639972123501482601377059155708292321789694103528266681104521268192526745361895856566384239849048923482217529011549596939269967690907738755747213669693953769070736092857407573675987242774763239531688324956444305397953424851627349331117467417542814921554060612622936755420459029769026126293588814831034143264949347763031994934813475762839410192390466491651507733968227

m = pow(c,d,n)
flag = n2s(int(m))
print(flag)# flag{y0u_kn0w_Pruning_and_lcg}

HaM3

(改编:第四届美团网络安全高校挑战赛_hamburgerRSA_c = pow(m,65537,n)_M3ng@L的博客-CSDN博客

解题思路:p,q是随机选取的两个64位二进制素数,关键是如何去表示PP和QQ。而PP和QQ是以字符串p,q拼接的方式形成,可以使用10^x * p + 10^y * q这样的形式表示PP和QQ。

先在sage上求出p,q

# sage
nbit = 64
n =142672086626283587048017713116658568907056287246536918432205313755474498483915485435443731126588499776739329317569276048159601495493064346081295993762052633
high = str(n)[:19]
low = str(n)[-18:]
for i in range(10):
    for j in range(10):
        pq = int(high + str(i) + str(j) + low)
        f = factor(pq)
        if len(f)==2 and f[0][0].nbits()==64:
            p = f[0][0]
            q = f[1][0]
            print(p,q)

后面就很简单了

import gmpy2
n = 142672086626283587048017713116658568907056287246536918432205313755474498483915485435443731126588499776739329317569276048159601495493064346081295993762052633
c = 35771468551700967499031290145813826705314774357494021918317304230766070868171631520643911378972522363861624359732252684003796428570328730483253546904382041
e = 65537
p =9937378783676979077
q = 14357114660923972229
PP = int(str(p)+str(q)+str(q)+str(p))
QQ = int(str(q)+str(p)+str(p)+str(q))
phi = (PP-1)*(QQ-1)
d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c, d, PP*QQ)
flag = libnum.n2s(int(m))
print(flag)

# flag{HaMbu2g3r_1S_2ea1ll_D3lci0U3_By_R3A!!}

 

 

 

 

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值