BUU [NPUCTF2020]共 模 攻 击

题目
BUU [NPUCTF2020]共 模 攻 击_第1张图片

hint

是共模攻击的老套路了,用扩展欧几里得算法就能解出来。
BUU [NPUCTF2020]共 模 攻 击_第2张图片
解出来得到的提示为:m.bit_length() < 400

task

这里放上大佬写的博客
链接

BUU [NPUCTF2020]共 模 攻 击_第3张图片

BUU [NPUCTF2020]共 模 攻 击_第4张图片
这里的
m2 - (c1 + c2)m + c1 * c2 = ijn ≡ 0 mod n
是通过公式化简,得到一个关于未知量 m 的多项式,然后用sage解多项式求根就能得到 flag 了。

我写的代码:

from gmpy2 import*
from libnum import*
from sympy import*

p = 107316975771284342108362954945096489708900302633734520943905283655283318535709

e1 = 2303413961
c1 = 1754421169036191391717309256938035960912941109206872374826444526733030696056821731708193270151759843780894750696642659795452787547355043345348714129217723

e2 = 2622163991
c2 = 1613454015951555289711148366977297613624544025937559371784736059448454437652633847111272619248126613500028992813732842041018588707201458398726700828844249
n =  6807492006219935335233722232024809784434293293172317282814978688931711423939629682224374870233587969960713638310068784415474535033780772766171320461281579

s = gcdext(e1,e2)
c = pow(c1,s[1],n)*pow(c2,s[2],n) % n
print(c)
#c = 19384002358725759679198917686763310349050988223627625096050800369760484237557
m = nthroot_mod(c,256,p)
print(n2s(m))

# m ="m.bit_length() < 400"
from gmpy2 import*
from libnum import*
from Crypto.Util.number import*

n = 128205304743751985889679351195836799434324346996129753896234917982647254577214018524580290192396070591032007818847697193260130051396080104704981594190602854241936777324431673564677900773992273463534717009587530152480725448774018550562603894883079711995434332008363470321069097619786793617099517770260029108149
c1 = 96860654235275202217368130195089839608037558388884522737500611121271571335123981588807994043800468529002147570655597610639680977780779494880330669466389788497046710319213376228391138021976388925171307760030058456934898771589435836261317283743951614505136840364638706914424433566782044926111639955612412134198
c2 = 9566853166416448316408476072940703716510748416699965603380497338943730666656667456274146023583837768495637484138572090891246105018219222267465595710692705776272469703739932909158740030049375350999465338363044226512016686534246611049299981674236577960786526527933966681954486377462298197949323271904405241585

a = c1+c2
b = c1*c2

print(a)
print(b)

# a = 106427507401691650533776606268030543324548306805584488340881108460215302001780649045082140067384306297497785054794169701530927082798998717147796265177082494273319180022953309137549878052025764276170773098393102683446915458123682447310617265418188192465923366892572673596378919944244343124060963227516817375783
# b = 926651656671911333597022401968870409343942400492881255142377951759176631494915016941991504123810265329862246592861145719213675502795378053564904818765377025096483601036025012267103260702787555612216755188521913405305861451125814149409508425602231670292131422273268728629782633354498648021859614223672123489318899205627785426402597996319440198218774038390809403281952702730883306007226797632389267386912707857093556335846269954270572920361347019614365402744026533713442449916555425678184406380167614011131702418493073759816310890056281917310110034453007210415242707924141697749818907383248545179118594511927630223830

#注意:这里用n2s会报错,因为py3编码的缘故,你用python2的long_to_bytes()就不会报错,在网上的在线工具先转16进制再转字符串也不会报错。
flag = 4242839043019782000788118887372132807371568279472499477998758466224002905442227156537788110520335652385855
print(n2s(flag))

中间 Sage 求 m = flag 的代码:

a = 106427507401691650533776606268030543324548306805584488340881108460215302001780649045082140067384306297497785054794169701530927082798998717147796265177082494273319180022953309137549878052025764276170773098393102683446915458123682447310617265418188192465923366892572673596378919944244343124060963227516817375783
b = 926651656671911333597022401968870409343942400492881255142377951759176631494915016941991504123810265329862246592861145719213675502795378053564904818765377025096483601036025012267103260702787555612216755188521913405305861451125814149409508425602231670292131422273268728629782633354498648021859614223672123489318899205627785426402597996319440198218774038390809403281952702730883306007226797632389267386912707857093556335846269954270572920361347019614365402744026533713442449916555425678184406380167614011131702418493073759816310890056281917310110034453007210415242707924141697749818907383248545179118594511927630223830
n = 128205304743751985889679351195836799434324346996129753896234917982647254577214018524580290192396070591032007818847697193260130051396080104704981594190602854241936777324431673564677900773992273463534717009587530152480725448774018550562603894883079711995434332008363470321069097619786793617099517770260029108149

R.<x>=Zmod(n)[]
f = x^2 - a*x +b
f.small_roots(X=2^400)   #根的绝对边界,根就是flag

你可能感兴趣的:(BUU,Crypto,plus,密码学)