BUUCTF 每日打卡 2022-1-13

引言

填坑

[HICTF2021]baby_rsa

加密代码如下:

#!/usr/bin/env python
# coding=utf-8
from Crypto.Util.number import *
from gmpy2 import *
from binascii import *


size = 4096
next_state = getRandomInteger(size // 2)


def keygen(size):
    q = getPrime(size)
    k = 2
    while True:
        p = q * k + 1
        if isPrime(p):
        	break
        k += 1
    g = 2
    while True:
        if pow(g, q, p) == 1:
            break
        g += 1
    A = getRandomInteger(size) % q
    B = getRandomInteger(size) % q
    d = getRandomInteger(size) % q
    h = pow(g, d, p)
    return (g, h, A, B, p, q)


def rand(A, B, M):
    global next_state
    next_state, ret = (B * next_state + A) % M, next_state
    return ret


def enc(pubkey, m):
    g, h, A, B, p, q = pubkey
    assert 0 < m <= p
    r = rand(A, B, q)
	e = 0xfaab
    c1 = (pow(m,e,p) * pow(h, r, p)) % p
	r = rand(A, B, q)
    c2 = (m * pow(h, r, p)) % p
    return (c1, c2)


pubkey= keygen(size)
print(pubkey)

secret = bytes_to_long("HITCTF2021(xxxxxxxxxxxxxxxxxxx)")
c1,c2= enc(pubkey, secret)

print(c1, c2)

#pk = (52, 
#47782489586021221729935382562238217213800826152327617948974334325027793433971508995399461776417812670604694882926777607105164020070178881963632306169611641854448509182837621758791538269408388860349616761041456174827996858614494726877767399938809515247000929894281600963992080920650256329287847887064428158469516438206831721224607859023980203694210651902538562842945949404149023836218548894116477022953606370852246884414011363477543284815671096832245521762246149180260936985618856296642080245029837974725521906177900378634071571992373478242159162403228753252168867425697897820696887070051128304178291193132322824455442092893684929701869625045112839344191126228806117685809636908190595562295591835629941512331963039016185366202513504464795106031092314892430859175307526232632986110464780357940552264674214665391043812843917461961230679207586174459563057178720743465356337218948534837994061644332424634750340190113117958830588820626581860957277456320434445207368613679418733984291985618038226928033006640791987978775285182325347153201516936002001839296455263977479446850434913069389565277028444638437387429263495729274142916464752814676819557878779855996225208596159171827854923873570163767937947956753277454486339143489103105750331110111L,
#433229619560374735022060612660487139311547277564407316269466855779330930804160973325703376198605206390912154427123102710354958367692760474727012214464298979098489170777185729836132968187705068687678796437447631516334893543456227545790012358063578349956636488453355182971532300478038635153420232589545761194907476691636706445176390661463152150169542241304542401678253873515488446133330974312465916350895130227137954122794991542025930903127027608739905609108321738139103065645651901833223353774916656293079960486497159730921219805951217073283062070931854507016733789164315751827862830668829125950364981217520865411859759718244136420504507997449935455788230060974032741364271601426191469331266168231203426316280988734802654397014768828735251891167507794161264913387252048434549271931367148180980260205843989153008044839641263127846901551223167574691783927938948745126094512037792728067785201012834153473172824948188352810070916677679450209134179624791196123158336411804834221293611075447043002901607162001357780058394706516204775756666576041740010288970758149528406172022049389998133360726123682741312251431519423867620962951022993364287241463507027520966721930799696555390707280246584903566049326608205785466271642132178515338520410658L, 
#594494499417894774789048451572687632660208181953899084791149805130704950465573064455173172705283156011806901684972459390817538594318847879599780068410149543731305374894040638491310362570467887919519584736646557258917947483658649575357363123407313011773027073062592473100264464401987309633458687673513776139455296286685115396610808047870099635374955339289799615102534094497730932884838674370338192153202045642565170696704452991192684466848026383861073123033948004049599266417667125680356386669226827901570782628388996520826906941293858994180130505009152517646592286697346622724843482147801718703310671546709185342317509441259927498881276856470161174444209513355803640646947368551446328198695259259829546707119878154837158880677882305548928799964929213106969848547576414765380870575558771867763848114411251654245747231121164090765647221739709450477815688276801154266722035408374135871417564206013020997849375553619152730479571927135850379285559873197371293312934173379820835252091990919727655797413411368987930118553258247264348519581466374312010472449698571319621067244494880512957538208007914329691196084901181642263713183616896210154681618376310287185315262021479758282631576946335858068664109425856174388362174761355148787245515144L, 
#261181509476485410165375351178418657075805043256124045823778754055035546150122155335065215645750231604267318872693494310557376958843829685914382636208107544361140482291909865660810395856913449414106045946602124226832733980696161639105193768954092281635195760991693212657816181524313660831938528737461195472275606167593968953647934279724693129491600232382201769523725243272086370087058597321533767924008747705935388941121530345216164771817150616453601212026925759807092457510188966636612860912597984231762129535299227711879953931847880037605415987083573556274570400085013894504645789376654166259691075373526751505971657856429187752015665407876751018316490729668209646098952144838144486106489379202197360745365239628186669447122272538227142855706247593556669905666428363734481409983627496127639634726855140379146669911302677456457202808949896992958886949162850488164457334796828240069980922051762068458877051063958308363343196940785994299643315504146607392461323382470475501119070077564995866998018505817611171892860136485534016608294708527673407517876647349723758712907513973353401204912431800080247493896815299218218930415151745986776831977527196435124521552249406640177674130330651411672455343809240941664288436809369136070604763156723L, 
#781980567294866497501123805923409152921571985796778580310714832500106425599168129745704238460330034743315325966148186558555020834861765526689768371880561510063294857161406783415599987595549249742832472894018336008481239463162160596123334637587102639626334613747584469035377788994951080335145295621141303809208401699383140579784234370433212962549701294557490327915345039736785539182810171621358586598828585945914338147070450135377738837775900049262279077924927424572133106317931037834170242253287377939407573458979723688263335125293054004806634691866986695432845509236568546421095177774413671436200824471636980556801370827632298658729537149331589875199074040922783371553748936641151156007453231144303475285524669545469070200964887839003421723671399980708592531935414262678088053843196096190537828523518384368702604524858315737895816793263164649577505835816917629234902199990503712784374018119048109158314524143587749590847895032293396106716513485468884408566836474462501500356497238218550499994067382687458598481617175106389271282319486609800621311007926196777720697327886147764674266204885628982776927834776344964727336572310616726876742447686216871630304048650918084364293803385183867282800430566589645701462385656793820570672943583L)
#c1,c2 = (94439884067875866926510480826480805218086956848743547499198006820458557396798764306362789177343865957780128049481100649740991723046823411381255593998762330282701428367295145704749575923764033888430043419432755523895502809914793389377786178823780078298402526077689075100615167801149188073166609798060195606072633000544828049766057724062947725409167355039403877440527580919770561607036599124342541749265192021823491918944278440530549040290346018294412510920437610359378345321588108996817523300112050660236797578506114472897358316471445079369284771733206616722439988368610144077799745808242486800244677553898369876207696781377538070465563883203111584722721805287175889444151342208592141472448213468221732504380079996468560634932304003913239528756529682825338927264423302712140156109639630352986070846491530710979222740690647201189995078959423441714667664068681190006816257273563900319001844315873583504406793282181337548468252678860728542345494826571860793722889527787190697802307747398283993641414712543326007228545296721676768940364724157476527100408795556913732012808496296586935767075610857696900781575977854898411278115773743046743452254128886824788564219765260031723480676483312846917497210349237445933078576069670523680684713623446L, 36397082263544765924779841921119370016762339442058655416586193728619075025998163340396086334077244844310435402140631243689371206933579011146142036715931618067708305508617210563902014072058872403638202493268214994615135134434419245572034705984431586848768861656760831721539666418749603708776469542844144251059399582543923184073020411373179905155719536662312209785364646479188735299232303697790049147771382959302788060004896713986087257232599766636580823138965201801581260077589060485570410897810958498454358737888682940093471597533949463149992040055832220962541050083923086389598838921222167415555331634007862804183991931445726265293675584802614392692457772587297132115782027787479633548163420352103982803350538152059924978489540395956166707435927694988026192837010341182919501051673735679100778154041581361254807291072654267471473503037873994575370262350787611333206450177404857861689910339996980215797433744385047164909022377659304404477322770853683922772248965438499817404000913895236832920522508813098567854697829563333570746651008308539370730448094601234580689549622502198266967939450827346984012446321546195185770288650359658551649011648788273482810013579385313367223458143686448798406205345442061625590854243243883117300950978940L)

这道题给出两种解法,一种是学长给的,另一种是我自己解的
首先来分析一下代码,主要的加密部分其实就是enc()函数,即以下四个恒等式和一个不等式:
{ c 1 ≡ [ ( m e   m o d   p ) × ( h r 1   m o d   p )   m o d   p ] ⋯ ① c 2 ≡ [ m × ( h r 2   m o d   p ) ]   m o d   p ⋯ ② r 2 ≡ ( B × r 1 + A )   m o d   p ⋯ ③ h ≡ g d   m o d   p ⋯ ④ 0 < m ≤ p ⋯ ⑤ \begin{cases} c_1 \equiv [(m^e \space mod \space p)\times (h^{r_1} \space mod \space p)\space mod \space p]\cdots ①\\ c_2 \equiv [m\times (h^{r_2} \space mod \space p) ]\space mod \space p \cdots ②\\ r_2 \equiv (B\times r_1 + A)\space mod \space p \cdots ③\\ h \equiv g ^d \space mod \space p \cdots ④\\ 0 < m \leq p\cdots ⑤ \end{cases} c1[(me mod p)×(hr1 mod p) mod p]c2[m×(hr2 mod p)] mod pr2(B×r1+A) mod phgd mod p0<mp
而其中 g , h , A , B , p , q , c 1 , c 2 g, h, A, B, p, q, c_1, c_2 g,h,A,B,p,q,c1,c2是已知的,而由于 d d d是随机生成的且 g , h g, h g,h已知,而上三式也没有出现 g , d g, d g,d,所以④式基本上是没用的,简化为:
{ c 1 ≡ [ ( m e   m o d   p ) × ( h r 1   m o d   p ) ]   m o d   p ⋯ ① c 2 ≡ [ m × ( h r 2   m o d   p ) ]   m o d   p ⋯ ② r 2 ≡ ( B × r 1 + A )   m o d   p ⋯ ③ 0 < m ≤ p ⋯ ⑤ \begin{cases} c_1 \equiv [(m^e \space mod \space p)\times (h^{r_1} \space mod \space p)]\space mod \space p\cdots ①\\ c_2 \equiv [m\times (h^{r_2} \space mod \space p) ]\space mod \space p \cdots ②\\ r_2 \equiv (B\times r_1 + A)\space mod \space p \cdots ③\\ 0 < m \leq p\cdots ⑤ \end{cases} c1[(me mod p)×(hr1 mod p)] mod pc2[m×(hr2 mod p)] mod pr2(B×r1+A) mod p0<mp

解法一

对于模方程,显然按照“三个方程可以解出三个未知数”的思想是行不通的(因为未知数不止三个),于是采用整体替换的想法
我的想法是替换①中的 h r 1   m o d   p h^{r_1} \space mod \space p hr1 mod p
首先,由③可得:
r 1 ≡ ( r 2 − A ) × B − 1   m o d   p r_1 \equiv (r_2-A) \times B^{-1} \space mod \space p r1(r2A)×B1 mod p
这里的 B − 1 B^{-1} B1指的是模 p p p取逆,下文中类似的表示意义相似
所以有
h r 1   m o d   p ≡ ( h r 2   m o d   p ) B − 1   m o d   p × ( h ( − A × B − 1 )   m o d   p   m o d   p ) ⋯ ( ∗ ) h^{r_1} \space mod \space p \equiv (h^{r_2} \space mod \space p )^{B^{-1} \space mod \space p }\times (h^{(-A\times B^{-1}) \space mod \space p } \space mod \space p )\cdots (*) hr1 mod p(hr2 mod p)B1 mod p×(h(A×B1) mod p mod p)()
又由②式可得:
h r 2   m o d   p ≡ c 2 × m − 1 h^{r_2} \space mod \space p \equiv c_2 \times m^{-1} hr2 mod pc2×m1
带入 ( ∗ ) (*) ()得:
h r 1   m o d   p ≡ ( c 2 × m − 1   m o d   p ) B − 1   m o d   p × ( h ( − A × B − 1 )   m o d   p   m o d   p ) ⋯ ( ∗ ∗ ) h^{r_1} \space mod \space p \equiv (c_2 \times m^{-1} \space mod \space p )^{B^{-1} \space mod \space p }\times (h^{(-A\times B^{-1}) \space mod \space p } \space mod \space p )\cdots (**) hr1 mod p(c2×m1 mod p)B1 mod p×(h(A×B1) mod p mod p)()
再将 ( ∗ ∗ ) (**) ()带入①可得:
c 1 ≡ [ ( m e   m o d   p ) × ( c 2 × m − 1   m o d   p ) B − 1   m o d   p × ( h ( − A × B − 1 )   m o d   p   m o d   p ) ]   m o d   p ≡ [ ( m e + ( − B − 1   m o d   p )   m o d   p ) × ( c 2 B − 1   m o d   p   m o d   p ) × ( h ( − A × B − 1 )   m o d   p   m o d   p ) ]   m o d   p \begin{aligned} c_1 &\equiv [(m^e \space mod \space p)\times (c_2 \times m^{-1} \space mod \space p )^{B^{-1} \space mod \space p }\times (h^{(-A\times B^{-1}) \space mod \space p } \space mod \space p )]\space mod \space p\\ &\equiv [(m^{e+(-B^{-1}\space mod \space p)} \space mod \space p)\times (c_2^{B^{-1} \space mod \space p } \space mod \space p )\times (h^{(-A\times B^{-1}) \space mod \space p } \space mod \space p )]\space mod \space p \end{aligned} c1[(me mod p)×(c2×m1 mod p)B1 mod p×(h(A×B1) mod p mod p)] mod p[(me+(B1 mod p) mod p)×(c2B1 mod p mod p)×(h(A×B1) mod p mod p)] mod p
c 2 B − 1   m o d   p   m o d   p c_2^{B^{-1} \space mod \space p } \space mod \space p c2B1 mod p mod p k 1 k_1 k1 h ( − A × B − 1 )   m o d   p   m o d   p h^{(-A\times B^{-1}) \space mod \space p}\space mod \space p h(A×B1) mod p mod p k 2 k_2 k2,因为 c 2 , B , A , h , p c_2,B,A, h,p c2,B,A,h,p均已知,所以 k 1 , k 2 k_1,k_2 k1,k2也已知
c 1 ≡ [ ( m e + ( − B − 1   m o d   p )   m o d   p ) × k 1 × k 2 ]   m o d   p c_1 \equiv [(m^{e+(-B^{-1}\space mod \space p)} \space mod \space p)\times k_1 \times k_2]\space mod \space p c1[(me+(B1 mod p) mod p)×k1×k2] mod p
进而
c 1 × k 1 − 1 × k 2 − 1   m o d   p ≡ m e − B − 1   m o d   p   m o d   p c_1 \times k_1^{-1} \times k_2^{-1}\space mod \space p \equiv m^{e-B^{-1}\space mod \space p} \space mod \space p c1×k11×k21 mod pmeB1 mod p mod p
c 1 × k 1 − 1 × k 2 − 1   m o d   p c_1 \times k_1^{-1} \times k_2^{-1}\space mod \space p c1×k11×k21 mod p c c c e − B − 1   m o d   p e-B^{-1}\space mod \space p eB1 mod p e ′ e' e,这样看起来是不是就像是 c c c m m m用公钥 ( e ′ , p ) (e', p) (e,p)经过RSA加密?
因此类比RSA解密即可解出 m m m
需要注意的是,这里 g c d ( e ′ , p − 1 ) = 2 gcd(e', p-1)=2 gcd(e,p1)=2不同于常规RSA加密的 g c d ( e , φ ) = 1 gcd(e, \varphi)=1 gcd(e,φ)=1,最后结果要开根号(感谢Pheonix大佬的提醒)
原稿(最后一步错了):
在这里插入图片描述
解密代码如下:

from Crypto.Util.number import *
import gmpy2

g, h, A, B, p, q = (52,
47782489586021221729935382562238217213800826152327617948974334325027793433971508995399461776417812670604694882926777607105164020070178881963632306169611641854448509182837621758791538269408388860349616761041456174827996858614494726877767399938809515247000929894281600963992080920650256329287847887064428158469516438206831721224607859023980203694210651902538562842945949404149023836218548894116477022953606370852246884414011363477543284815671096832245521762246149180260936985618856296642080245029837974725521906177900378634071571992373478242159162403228753252168867425697897820696887070051128304178291193132322824455442092893684929701869625045112839344191126228806117685809636908190595562295591835629941512331963039016185366202513504464795106031092314892430859175307526232632986110464780357940552264674214665391043812843917461961230679207586174459563057178720743465356337218948534837994061644332424634750340190113117958830588820626581860957277456320434445207368613679418733984291985618038226928033006640791987978775285182325347153201516936002001839296455263977479446850434913069389565277028444638437387429263495729274142916464752814676819557878779855996225208596159171827854923873570163767937947956753277454486339143489103105750331110111,
433229619560374735022060612660487139311547277564407316269466855779330930804160973325703376198605206390912154427123102710354958367692760474727012214464298979098489170777185729836132968187705068687678796437447631516334893543456227545790012358063578349956636488453355182971532300478038635153420232589545761194907476691636706445176390661463152150169542241304542401678253873515488446133330974312465916350895130227137954122794991542025930903127027608739905609108321738139103065645651901833223353774916656293079960486497159730921219805951217073283062070931854507016733789164315751827862830668829125950364981217520865411859759718244136420504507997449935455788230060974032741364271601426191469331266168231203426316280988734802654397014768828735251891167507794161264913387252048434549271931367148180980260205843989153008044839641263127846901551223167574691783927938948745126094512037792728067785201012834153473172824948188352810070916677679450209134179624791196123158336411804834221293611075447043002901607162001357780058394706516204775756666576041740010288970758149528406172022049389998133360726123682741312251431519423867620962951022993364287241463507027520966721930799696555390707280246584903566049326608205785466271642132178515338520410658,
594494499417894774789048451572687632660208181953899084791149805130704950465573064455173172705283156011806901684972459390817538594318847879599780068410149543731305374894040638491310362570467887919519584736646557258917947483658649575357363123407313011773027073062592473100264464401987309633458687673513776139455296286685115396610808047870099635374955339289799615102534094497730932884838674370338192153202045642565170696704452991192684466848026383861073123033948004049599266417667125680356386669226827901570782628388996520826906941293858994180130505009152517646592286697346622724843482147801718703310671546709185342317509441259927498881276856470161174444209513355803640646947368551446328198695259259829546707119878154837158880677882305548928799964929213106969848547576414765380870575558771867763848114411251654245747231121164090765647221739709450477815688276801154266722035408374135871417564206013020997849375553619152730479571927135850379285559873197371293312934173379820835252091990919727655797413411368987930118553258247264348519581466374312010472449698571319621067244494880512957538208007914329691196084901181642263713183616896210154681618376310287185315262021479758282631576946335858068664109425856174388362174761355148787245515144,
261181509476485410165375351178418657075805043256124045823778754055035546150122155335065215645750231604267318872693494310557376958843829685914382636208107544361140482291909865660810395856913449414106045946602124226832733980696161639105193768954092281635195760991693212657816181524313660831938528737461195472275606167593968953647934279724693129491600232382201769523725243272086370087058597321533767924008747705935388941121530345216164771817150616453601212026925759807092457510188966636612860912597984231762129535299227711879953931847880037605415987083573556274570400085013894504645789376654166259691075373526751505971657856429187752015665407876751018316490729668209646098952144838144486106489379202197360745365239628186669447122272538227142855706247593556669905666428363734481409983627496127639634726855140379146669911302677456457202808949896992958886949162850488164457334796828240069980922051762068458877051063958308363343196940785994299643315504146607392461323382470475501119070077564995866998018505817611171892860136485534016608294708527673407517876647349723758712907513973353401204912431800080247493896815299218218930415151745986776831977527196435124521552249406640177674130330651411672455343809240941664288436809369136070604763156723,
781980567294866497501123805923409152921571985796778580310714832500106425599168129745704238460330034743315325966148186558555020834861765526689768371880561510063294857161406783415599987595549249742832472894018336008481239463162160596123334637587102639626334613747584469035377788994951080335145295621141303809208401699383140579784234370433212962549701294557490327915345039736785539182810171621358586598828585945914338147070450135377738837775900049262279077924927424572133106317931037834170242253287377939407573458979723688263335125293054004806634691866986695432845509236568546421095177774413671436200824471636980556801370827632298658729537149331589875199074040922783371553748936641151156007453231144303475285524669545469070200964887839003421723671399980708592531935414262678088053843196096190537828523518384368702604524858315737895816793263164649577505835816917629234902199990503712784374018119048109158314524143587749590847895032293396106716513485468884408566836474462501500356497238218550499994067382687458598481617175106389271282319486609800621311007926196777720697327886147764674266204885628982776927834776344964727336572310616726876742447686216871630304048650918084364293803385183867282800430566589645701462385656793820570672943583)
c1,c2 = (94439884067875866926510480826480805218086956848743547499198006820458557396798764306362789177343865957780128049481100649740991723046823411381255593998762330282701428367295145704749575923764033888430043419432755523895502809914793389377786178823780078298402526077689075100615167801149188073166609798060195606072633000544828049766057724062947725409167355039403877440527580919770561607036599124342541749265192021823491918944278440530549040290346018294412510920437610359378345321588108996817523300112050660236797578506114472897358316471445079369284771733206616722439988368610144077799745808242486800244677553898369876207696781377538070465563883203111584722721805287175889444151342208592141472448213468221732504380079996468560634932304003913239528756529682825338927264423302712140156109639630352986070846491530710979222740690647201189995078959423441714667664068681190006816257273563900319001844315873583504406793282181337548468252678860728542345494826571860793722889527787190697802307747398283993641414712543326007228545296721676768940364724157476527100408795556913732012808496296586935767075610857696900781575977854898411278115773743046743452254128886824788564219765260031723480676483312846917497210349237445933078576069670523680684713623446, 36397082263544765924779841921119370016762339442058655416586193728619075025998163340396086334077244844310435402140631243689371206933579011146142036715931618067708305508617210563902014072058872403638202493268214994615135134434419245572034705984431586848768861656760831721539666418749603708776469542844144251059399582543923184073020411373179905155719536662312209785364646479188735299232303697790049147771382959302788060004896713986087257232599766636580823138965201801581260077589060485570410897810958498454358737888682940093471597533949463149992040055832220962541050083923086389598838921222167415555331634007862804183991931445726265293675584802614392692457772587297132115782027787479633548163420352103982803350538152059924978489540395956166707435927694988026192837010341182919501051673735679100778154041581361254807291072654267471473503037873994575370262350787611333206450177404857861689910339996980215797433744385047164909022377659304404477322770853683922772248965438499817404000913895236832920522508813098567854697829563333570746651008308539370730448094601234580689549622502198266967939450827346984012446321546195185770288650359658551649011648788273482810013579385313367223458143686448798406205345442061625590854243243883117300950978940)
e = 0xfaab
k1 = pow(c2, inverse(B, q), p)
k2 = pow(h, (-A * inverse(B, q)), p)
c = c1 * inverse(k1, p) * inverse(k2, p)
m = pow(c, inverse(e - inverse(B, q), p-1), p)
print(long_to_bytes(gmpy2.iroot(m, 2)[0]))

结果为:
在这里插入图片描述

解法二

不同与解法一采用整体替换 h r 1   m o d   p h^{r_1} \space mod \space p hr1 mod p的思路,如果可以直接求解 h r 1   m o d   p h^{r_1} \space mod \space p hr1 mod p,那么也可以求出 m m m
C = i n v e r s e ( e , p − 1 ) C=inverse(e, p - 1) C=inverse(e,p1),则记
t 1 = c 1 C = m × h C ∗ r 1   m o d   p t_1=c_1^{C}=m\times h^{C*r_1} \space mod \space p t1=c1C=m×hCr1 mod p
r 2 ≡ ( B × r 1 + A )   m o d   p r_2 \equiv (B\times r_1 + A)\space mod \space p r2(B×r1+A) mod p,所以记
t 2 = [ c 2 × ( i n v e r s e ( h A , p )   m o d   p ) ]   m o d   p ≡ m × h B × r 1   m o d   p t_2=[c_2\times (inverse(h^{A}, p)\space mod \space p)]\space mod \space p \equiv m\times h^{B\times r_1}\space mod \space p t2=[c2×(inverse(hA,p) mod p)] mod pm×hB×r1 mod p
再记
t 3 = t 1 × i n v e r s e ( t 2 , p )   m o d   p ≡ h r 1 × ( C − B )   m o d   p t_3 = t_1\times inverse(t_2, p) \space mod \space p\equiv h^{r_1\times (C-B)}\space mod \space p t3=t1×inverse(t2,p) mod phr1×(CB) mod p
又因为 g c d ( C − B , p − 1 ) = 167 gcd(C-B, p-1)=167 gcd(CB,p1)=167,所以记
t 4 = h r 1 × 167   m o d   p ≡ t 3 i n v e r s e ( C − B , p − 1 )   m o d   p t_4=h^{r_1\times 167} \space mod \space p \equiv t_3^{inverse(C - B, p - 1)}\space mod \space p t4=hr1×167 mod pt3inverse(CB,p1) mod p
要求 h r 1   m o d   p h^{r_1} \space mod \space p hr1 mod p,只要对 t 4 t_4 t4 p p p下开167次根即可
学长用“猜根”的方法,没怎么看懂,但是或许类似的方法可以用在别的地方,有大佬看懂了的话欢迎指导
解密代码如下:

from Crypto.Util.number import *

pk = (52,
      47782489586021221729935382562238217213800826152327617948974334325027793433971508995399461776417812670604694882926777607105164020070178881963632306169611641854448509182837621758791538269408388860349616761041456174827996858614494726877767399938809515247000929894281600963992080920650256329287847887064428158469516438206831721224607859023980203694210651902538562842945949404149023836218548894116477022953606370852246884414011363477543284815671096832245521762246149180260936985618856296642080245029837974725521906177900378634071571992373478242159162403228753252168867425697897820696887070051128304178291193132322824455442092893684929701869625045112839344191126228806117685809636908190595562295591835629941512331963039016185366202513504464795106031092314892430859175307526232632986110464780357940552264674214665391043812843917461961230679207586174459563057178720743465356337218948534837994061644332424634750340190113117958830588820626581860957277456320434445207368613679418733984291985618038226928033006640791987978775285182325347153201516936002001839296455263977479446850434913069389565277028444638437387429263495729274142916464752814676819557878779855996225208596159171827854923873570163767937947956753277454486339143489103105750331110111,
      433229619560374735022060612660487139311547277564407316269466855779330930804160973325703376198605206390912154427123102710354958367692760474727012214464298979098489170777185729836132968187705068687678796437447631516334893543456227545790012358063578349956636488453355182971532300478038635153420232589545761194907476691636706445176390661463152150169542241304542401678253873515488446133330974312465916350895130227137954122794991542025930903127027608739905609108321738139103065645651901833223353774916656293079960486497159730921219805951217073283062070931854507016733789164315751827862830668829125950364981217520865411859759718244136420504507997449935455788230060974032741364271601426191469331266168231203426316280988734802654397014768828735251891167507794161264913387252048434549271931367148180980260205843989153008044839641263127846901551223167574691783927938948745126094512037792728067785201012834153473172824948188352810070916677679450209134179624791196123158336411804834221293611075447043002901607162001357780058394706516204775756666576041740010288970758149528406172022049389998133360726123682741312251431519423867620962951022993364287241463507027520966721930799696555390707280246584903566049326608205785466271642132178515338520410658,
      594494499417894774789048451572687632660208181953899084791149805130704950465573064455173172705283156011806901684972459390817538594318847879599780068410149543731305374894040638491310362570467887919519584736646557258917947483658649575357363123407313011773027073062592473100264464401987309633458687673513776139455296286685115396610808047870099635374955339289799615102534094497730932884838674370338192153202045642565170696704452991192684466848026383861073123033948004049599266417667125680356386669226827901570782628388996520826906941293858994180130505009152517646592286697346622724843482147801718703310671546709185342317509441259927498881276856470161174444209513355803640646947368551446328198695259259829546707119878154837158880677882305548928799964929213106969848547576414765380870575558771867763848114411251654245747231121164090765647221739709450477815688276801154266722035408374135871417564206013020997849375553619152730479571927135850379285559873197371293312934173379820835252091990919727655797413411368987930118553258247264348519581466374312010472449698571319621067244494880512957538208007914329691196084901181642263713183616896210154681618376310287185315262021479758282631576946335858068664109425856174388362174761355148787245515144,
      261181509476485410165375351178418657075805043256124045823778754055035546150122155335065215645750231604267318872693494310557376958843829685914382636208107544361140482291909865660810395856913449414106045946602124226832733980696161639105193768954092281635195760991693212657816181524313660831938528737461195472275606167593968953647934279724693129491600232382201769523725243272086370087058597321533767924008747705935388941121530345216164771817150616453601212026925759807092457510188966636612860912597984231762129535299227711879953931847880037605415987083573556274570400085013894504645789376654166259691075373526751505971657856429187752015665407876751018316490729668209646098952144838144486106489379202197360745365239628186669447122272538227142855706247593556669905666428363734481409983627496127639634726855140379146669911302677456457202808949896992958886949162850488164457334796828240069980922051762068458877051063958308363343196940785994299643315504146607392461323382470475501119070077564995866998018505817611171892860136485534016608294708527673407517876647349723758712907513973353401204912431800080247493896815299218218930415151745986776831977527196435124521552249406640177674130330651411672455343809240941664288436809369136070604763156723,
      781980567294866497501123805923409152921571985796778580310714832500106425599168129745704238460330034743315325966148186558555020834861765526689768371880561510063294857161406783415599987595549249742832472894018336008481239463162160596123334637587102639626334613747584469035377788994951080335145295621141303809208401699383140579784234370433212962549701294557490327915345039736785539182810171621358586598828585945914338147070450135377738837775900049262279077924927424572133106317931037834170242253287377939407573458979723688263335125293054004806634691866986695432845509236568546421095177774413671436200824471636980556801370827632298658729537149331589875199074040922783371553748936641151156007453231144303475285524669545469070200964887839003421723671399980708592531935414262678088053843196096190537828523518384368702604524858315737895816793263164649577505835816917629234902199990503712784374018119048109158314524143587749590847895032293396106716513485468884408566836474462501500356497238218550499994067382687458598481617175106389271282319486609800621311007926196777720697327886147764674266204885628982776927834776344964727336572310616726876742447686216871630304048650918084364293803385183867282800430566589645701462385656793820570672943583)
c1, c2 = (
94439884067875866926510480826480805218086956848743547499198006820458557396798764306362789177343865957780128049481100649740991723046823411381255593998762330282701428367295145704749575923764033888430043419432755523895502809914793389377786178823780078298402526077689075100615167801149188073166609798060195606072633000544828049766057724062947725409167355039403877440527580919770561607036599124342541749265192021823491918944278440530549040290346018294412510920437610359378345321588108996817523300112050660236797578506114472897358316471445079369284771733206616722439988368610144077799745808242486800244677553898369876207696781377538070465563883203111584722721805287175889444151342208592141472448213468221732504380079996468560634932304003913239528756529682825338927264423302712140156109639630352986070846491530710979222740690647201189995078959423441714667664068681190006816257273563900319001844315873583504406793282181337548468252678860728542345494826571860793722889527787190697802307747398283993641414712543326007228545296721676768940364724157476527100408795556913732012808496296586935767075610857696900781575977854898411278115773743046743452254128886824788564219765260031723480676483312846917497210349237445933078576069670523680684713623446,
36397082263544765924779841921119370016762339442058655416586193728619075025998163340396086334077244844310435402140631243689371206933579011146142036715931618067708305508617210563902014072058872403638202493268214994615135134434419245572034705984431586848768861656760831721539666418749603708776469542844144251059399582543923184073020411373179905155719536662312209785364646479188735299232303697790049147771382959302788060004896713986087257232599766636580823138965201801581260077589060485570410897810958498454358737888682940093471597533949463149992040055832220962541050083923086389598838921222167415555331634007862804183991931445726265293675584802614392692457772587297132115782027787479633548163420352103982803350538152059924978489540395956166707435927694988026192837010341182919501051673735679100778154041581361254807291072654267471473503037873994575370262350787611333206450177404857861689910339996980215797433744385047164909022377659304404477322770853683922772248965438499817404000913895236832920522508813098567854697829563333570746651008308539370730448094601234580689549622502198266967939450827346984012446321546195185770288650359658551649011648788273482810013579385313367223458143686448798406205345442061625590854243243883117300950978940)
(g, h, A, B, p, q) = pk

e = 0xfaab
C = inverse(e, p - 1)
t1 = pow(c1, C, p)  # m * g^(C*d*r1) %p
t2 = (c2 * inverse(pow(h, A, p), p)) % p  # m*g^(d*B*r1)%p
t3 = (t1 * inverse(t2, p)) % p  # g^(d*r1*(C-B)) % p
D = inverse(C - B, p - 1)
t4 = pow(t3, D, p)  # g^(d*r1*167) %p

r = 167


def rthroot(c, r, q):
    c %= q
    assert (isPrime(r) and (q - 1) % r == 0 and (q - 1) % (r ** 2) != 0)
    l = ((q - 1) % (r ** 2)) // r
    alpha = (-inverse(l, r)) % r
    root = pow(c, ((1 + alpha * (q - 1) // r) // r), q)
    return root


def allroot(r, q, root):
    all_root = set()
    all_root.add(root)
    while len(all_root) < r:
        new_root = root
        unity = pow(getRandomRange(2, q), (q - 1) // r, q)
        for i in range(r - 1):
            new_root = (new_root * unity) % q
            all_root.add(new_root)
    return all_root


proot = rthroot(t4, r, p)
roots = allroot(r, p, proot)
# root = g^(d*r1)

for root in roots:
    cur = pow(root, C, p)
    flag = (inverse(cur, p) * t1) % p
    guess = long_to_bytes(flag)
    if b"HITCTF" in guess:
        print(guess)

结果相同

结语

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值