[XYCTF2024] 铜匠
题目描述:
from Crypto.Util.number import *
from secrets import flag
m = bytes_to_long(flag)
m1 = getRandomRange(1, m)
m2 = getRandomRange(1, m)
m3 = m - m1 - m2
def task1():
e = 149
p = getPrime(512)
q = getPrime(512)
n = p * q
d = inverse(e,(p-1)*(q-1))
return (pow(m1, e, n), d >> 222 << 222, n)
def task2():
e = 65537
p = getPrime(1024)
q = getPrime(1024)
n = p * q
return (pow(m2, e, n), (p + q) & ((1 << 624) - 1), n)
def task3():
e = 65537
p = getPrime(512)
q = getPrime(512)
n = p * q
return (pow(m3, e, n), (p ^ q) >> 200, n)
c1, leak1, n1 = task1()
c2, leak2, n2 = task2()
c3, leak3, n3 = task3()
print(c1, leak1, n1)
print(c2, leak2, n2)
print(c3, leak3, n3)
# (89623543982221289730635223555830551523170205418976759060541832483843039074358160566735322009158596405712449020903311144480669706226166537602750967447480664875090686428406188847601970724994074417752345460791736191511081890913041143570455636020205647345764692062144226011846336769477026234106683791286490222089, 138474880017294332349992670187778287774153347391371789199005713563195654993662610111557185709277805165708109047494971468100563949333712521647405765501704478862377527360106399421209690341743821320754482338590671565510629203215009008479290995785318405211007685664887994061938667418220613430135743123498167435264, 146331610798417415036517077006943013321623040860385791423062775325646472298267580898028515394910588437521335092742913111680737790430660749825981979147191282007208147041227246620008377726207734522466015971515317594545750944838673018946440525615131606652748549901880641896940968837669894325535750125282351577689)
# (5473961166821344576614003060897848014482672788904094340704447882490091115468180944569409159343222459801235179587721232166576530621751748850763430788036935832653535110975154800191323351333883661451331971042214143454441651165718504131976920077768864850035471790911190772583977173388975105970866592974077361193822302653046511418190410043729876062517148438923211673300268277037622337403526399584759202097925983596261279676101079771530118525540842499517622478819211528345668513680064744443628779623340175578509413636950545134641050948185944279029949957748464529075830770617236599864271566534714755373562527112224962839980,62964793504732923650344975634773688108135580826064134090114181449607062497690184718845295432644650580930430061411603385577783897575232298084007041511817031640186953023971498914096209984730,20748652069632848434897928314437138341436264859802586939154590237186029244907936870477844563166827587536149170710720365760129683024401957095447466056746469055173897234659911291443605912459271248059341147358511860537769587963189092648473894868209838600346115919726589891777340166174017389513260737891557712152871714337946675533597049874155202056200170954033849176655928144354665553271709442011723088448485570394208728775665739819536229908847043007472178803394055783543378990699834066614262050119443421709878598533329555838915158259138297060574425019923291353077080236769586821808150397875920110335669136563171420068201)
# (34640310217688693418173336791306022698488916505988760907493665070072623574363578354500529023855888624978101429772253437880445815006839767802433777006836665709335479076676231470534690281412388704665083311568028710188940132495410474044569100181764053297307413009214044407982980600917158732129850605715306726034, 3763587651775261955566046684899146246387485307521708557610018711932791630073528010801142052497, 94848869174430082173244966077736519396702141299429965725051314270443078621842166791082354594193554380275167898342497998871366256044865879909218309960595691008663632410356093966762639308253848450178310347612630814852054763933063313537694449475061227647475480417779126252294793767003555255527593551612032661749)
题目分析:
part1:
d高位攻击
exp:
from tqdm import *
from Crypto.Util.number import *
def get_full_p(p_high, n,d_high,bits):
PR.<x> = PolynomialRing(Zmod(n))
f = x + p_high
f = f.monic()
roots = f.small_roots(X=2^(bits + 4), beta=0.4)
if roots:
x0 = roots[0]
p = gcd(x0 + p_high, n)
return ZZ(p)
def find_p_high(d_high, e, n,bits):
PR.<X> = PolynomialRing(RealField(1000))
for k in tqdm(range(1, e+1)):
f=e * d_high * X - (k*n*X + k*X + X-k*X**2 - k*n)
results = f.roots()
if results:
for x in results:
p_high = int(x[0]) >> 4 << 4
p = get_full_p(p_high, n,d_high,bits)
if p and p != 1:
return p
c1 = 89623543982221289730635223555830551523170205418976759060541832483843039074358160566735322009158596405712449020903311144480669706226166537602750967447480664875090686428406188847601970724994074417752345460791736191511081890913041143570455636020205647345764692062144226011846336769477026234106683791286490222089
leak1 = 138474880017294332349992670187778287774153347391371789199005713563195654993662610111557185709277805165708109047494971468100563949333712521647405765501704478862377527360106399421209690341743821320754482338590671565510629203215009008479290995785318405211007685664887994061938667418220613430135743123498167435264
n1 = 146331610798417415036517077006943013321623040860385791423062775325646472298267580898028515394910588437521335092742913111680737790430660749825981979147191282007208147041227246620008377726207734522466015971515317594545750944838673018946440525615131606652748549901880641896940968837669894325535750125282351577689
e1 = 149
p1 = find_p_high(leak1, e1, n1,222)
q1 = n1 // p1
d1 = inverse(e1,(p1 - 1) * (p1 - 1))
m1 = pow(c1,int(d1),n1)
# m1 = 11775517453863996563134035490381223284801389447022348837092806629482902301042769151917156039535676274713308069533584211081526392912472011090033981642998869
part2:
已知
(
p
+
q
)
低
624
位
又知道
n
=
p
∗
q
那么联立
l
e
a
k
2
和
n
2
%
2
624
即可得到
p
或
q
的低位
之后
c
o
p
p
e
r
一下即可得到完整的
p
或
q
已知(p + q)低624位\\ 又知道n = p * q\\ 那么联立leak2和n2 \% 2^{624}即可得到p或q的低位\\ 之后copper一下即可得到完整的p或q
已知(p+q)低624位又知道n=p∗q那么联立leak2和n2%2624即可得到p或q的低位之后copper一下即可得到完整的p或q
思路和d低位攻击差不多
exp:
from Crypto.Util.number import *
def get_full_p(p_low, n):
PR.<x> = PolynomialRing(Zmod(n))
nbits = n.nbits()
p_lowbits = p_low.nbits()
f = 2^p_lowbits*x + p_low
f = f.monic()
roots = f.small_roots(X=2^(nbits//2-p_lowbits), beta=0.4)
if roots:
x0 = roots[0]
p = gcd(2^p_lowbits*x0 + p_low, n)
return ZZ(p)
def find_p_low(low, n):
X = var('X')
results = solve_mod([n == X * (low - X)], 2^low.nbits())
for x in results:
p_low = ZZ(x[0])
p = get_full_p(p_low, n)
if p and p != 1:
return p
c2 = 5473961166821344576614003060897848014482672788904094340704447882490091115468180944569409159343222459801235179587721232166576530621751748850763430788036935832653535110975154800191323351333883661451331971042214143454441651165718504131976920077768864850035471790911190772583977173388975105970866592974077361193822302653046511418190410043729876062517148438923211673300268277037622337403526399584759202097925983596261279676101079771530118525540842499517622478819211528345668513680064744443628779623340175578509413636950545134641050948185944279029949957748464529075830770617236599864271566534714755373562527112224962839980
leak2 = 62964793504732923650344975634773688108135580826064134090114181449607062497690184718845295432644650580930430061411603385577783897575232298084007041511817031640186953023971498914096209984730
n2 = 20748652069632848434897928314437138341436264859802586939154590237186029244907936870477844563166827587536149170710720365760129683024401957095447466056746469055173897234659911291443605912459271248059341147358511860537769587963189092648473894868209838600346115919726589891777340166174017389513260737891557712152871714337946675533597049874155202056200170954033849176655928144354665553271709442011723088448485570394208728775665739819536229908847043007472178803394055783543378990699834066614262050119443421709878598533329555838915158259138297060574425019923291353077080236769586821808150397875920110335669136563171420068201
e2 = 65537
p2 = find_p_low(leak2, n2)
q2 = n2 // p2
d2 = inverse(e2,(p2 - 1) * (q2 - 1))
m2 = pow(c2,d2,n2)
print(m2)
# m2 = 637474741382124491125351127892971159828342019036405954553729272346832023284163998914076056292480317209934960796148267118196288511438260371617371342378683017480560448795
part3:
请参考:
https://tangcuxiaojikuai.xyz/post/342113ee.html
exp:
from gmpy2 import *
c3 = 34640310217688693418173336791306022698488916505988760907493665070072623574363578354500529023855888624978101429772253437880445815006839767802433777006836665709335479076676231470534690281412388704665083311568028710188940132495410474044569100181764053297307413009214044407982980600917158732129850605715306726034
leak3 = 3763587651775261955566046684899146246387485307521708557610018711932791630073528010801142052497
n3 = 94848869174430082173244966077736519396702141299429965725051314270443078621842166791082354594193554380275167898342497998871366256044865879909218309960595691008663632410356093966762639308253848450178310347612630814852054763933063313537694449475061227647475480417779126252294793767003555255527593551612032661749
leak3 = leak3 << 200
leak3 = bin(leak3)[2:].zfill(512)
leakbits = 200
def findp(pp,qq,l):
p_Min = int(pp + (512-l)*"0",2)
p_Max = int(pp + (512-l)*"1",2)
q_Min = int(qq + (512-l)*"0",2)
q_Max = int(qq + (512-l)*"1",2)
if(l == 512 - leakbits):
R.<x> = PolynomialRing(Zmod(n3))
phigh = p_Min
f3 = phigh + x
root = f3.small_roots(X=2^leakbits, beta=0.4)
if root != []:
p3 = phigh + int(root[0])
q3 = n3 // p3
d = gmpy2.invert(e,(p3-1)*(q3-1))
m3 = pow(c3,d,n3)
print(f"m3 = {m3}")
if (p_Max * q_Max < n3) or (p_Min * q_Min > n3):
return
# 以下是根据异或来操作的
if leak3[l] == '0':
findp(pp + '1',qq + '1',l+1)
findp(pp + '0',qq + '0',l+1)
if leak3[l] == '1':
findp(pp + '1',qq + '0',l+1)
findp(pp + '0',qq + '1',l+1)
findp('1','1',1)
# m3 = 334132319136130454419386550847309794306389604470819859736266178647538718607667083644497296078054806893307642673035506225568447967643224450929477875810797878149197295514
[2023 江苏省数据安全竞赛] hardrsa
来源在此
题目描述:
from Crypto.Util.number import *
from random import randint
# from secret import message
p, q = [getPrime(1024) for _ in range(2)]
n = p * q
def pad(msg: bytes) -> bytes:
return msg + long_to_bytes(len(msg) & 0xff) * (2048 // 8 - len(msg) - 1)
def f(x: int, poly: list[int]) -> int:
return sum([
poly[i] * pow(x, i, n) for i in range(len(poly))
]) % n
def commit(m: int, d: int, key: int, poly: list[int]) -> (int, int):
sig = pow(m, d, n)
c1 = (sig + pow(key, 8, n) + pow(key, 4, n) + pow(key, 2, n)) % n
c2 = f(key, poly)
return c1, c2
def reveal(comm: (int, int), e: int, key: int, poly: list[int]) -> int:
c1, c2 = comm
assert f(key, poly) == c2
sig = (c1 - pow(key, 8, n) - pow(key, 4, n) - pow(key, 2, n)) % n
return pow(sig, e, n)
def part1(msg):
e = 233
assert GCD(e, (p - 1) * (q - 1)) == 1
m = bytes_to_long(pad(msg))
c = pow(m, e, n)
print(f"# Part1: RSA-Encrypted Ciphertext\n"
f"{e = }\n"
f"{n = }\n"
f"{c = }\n")
def part2(msg):
e = getPrime(256)
assert GCD(e, (p - 1) * (q - 1)) == 1
d = inverse(e, (p - 1) * (q - 1))
key = getPrime(1024)
poly = [randint(n // 2, n) for _ in range(8)]
m = bytes_to_long(msg)
comm = commit(m, d, key, poly)
print(f"# Part2: RSA-Committed Promise\n"
f"{e = }\n"
f"{n = }\n"
f"{poly = }\n"
f"{comm = }\n")
part1(message)
part2(message)
'''
# Part1: RSA-Encrypted Ciphertext
e = 233
n = 11935450457829533235861673228297207102011152676397253867146913792126035709631838912054379483925100858088716543548565883127607546205725887108101118334914085611884304295616391635635730462010491550855190770776531821441961930152081076014630292188457483421965231052149991813167636622576040955869771100692060798499848216781403839908159869808167642603742236390452605002523104832413884128824863453874477895814675168541067154527938435375815931877307360825011810649184534014412683654903241610167115302439866360069493031086872354910005880773459207712493126679315455220650236256646891830311728264963649315399787003295334546874291
c = 7252592878713436249451954839264355322580930765631177572271016442117341039243270139159572914726052278102731751307948710556102124039673892501351580382026911586520822698910216934337820791611920030598567775355231131126300774119520299748279014958652077682887635170584723744587650744421280998057075011222009042174385778453331646210379693618543179886347307521772868295540264296894711602178922977038080083149136928926845871859677401680541048431032673765061924102033485570287098238695235990854284581798656185853973943961983020641995838344765211070928405487458023474992011192333056478388071341171355197120988215168198599723008
# Part2: RSA-Committed Promise
e = 66193637341723367163125702898112480448278699637268148343857725442855402823431
n = 11935450457829533235861673228297207102011152676397253867146913792126035709631838912054379483925100858088716543548565883127607546205725887108101118334914085611884304295616391635635730462010491550855190770776531821441961930152081076014630292188457483421965231052149991813167636622576040955869771100692060798499848216781403839908159869808167642603742236390452605002523104832413884128824863453874477895814675168541067154527938435375815931877307360825011810649184534014412683654903241610167115302439866360069493031086872354910005880773459207712493126679315455220650236256646891830311728264963649315399787003295334546874291
poly = [11717154796621555517773089565161800782497395722578959209529354534025874232277165805913450430518606899030436997688640019197332182511107284797218734095249300649807218465147399703372218739746124711200544753873488683088277396707752681278994522913785476758026448815685216381723435987067431688479748324396207672503845734170132747031467431651462218384749316037680784863900868165022343622041751554333022117572879116218759879246367088427084626950955537463817968031017275910364363695899152710198165120432170787171341528864286158526038651919017107408570791186937519694774479837991365808631767140379749029359380372242375950137980, 9123862087464108309368301961629788915272772896023134293061688494597654503820136260901587831268936385580664649067767056115754724046745958708702235170960467356062328703981921906752172049390790202666123073269199722768061043975957820847564911432200111405506704374689942732871658793810805164611038997319494337357970794059964303933995742679251310010710434981636137595085517852847956640902442517513717087059546226466932055404728069004610675179760781279470558117788079744090471741006843223391295194412058215189490450122125518118132532661928747925982914732441440478529947224247988342993141712946093256348898996486327422944643, 6030603763346983288102354051890376530618029881435881726123892326247756715375950846629522738204125453587401831309679161545839726580035304449416761250948280327548535169936710507270611945843758842074476358246176098954644815210291073632368712607495031631913377358289661882694855436741228045084898247782669601243425453739817361547681943880579046765521731792701727321918301930375236655162783436465648090046259078120078910758575245396369709495063070202433832221772728021708079141746515469950248160534726502810704256703088684677877258573049270790396920638239330550633086994873425126929073220720355594488969185367608970916707, 9716821256832823750824128939107476939193936880337072944057098552215636341970779759899504078211465219351423745606682464111980567519009576095570498485630378890832910178268396634042751260634975171396984879182577992189999471936271429379306815019808996603918680787757713732404409692378153404122817226376865296438358486825612038858671776168645459752591925049260849071890295705474681598072886213619765003334857584781191985867775067185431488903206792188339131394272348988190482038716689478427650052247117559254256426511237932521351563089652047479479797300938563071283204961821455011631287889953996753731046822530037290627603, 11666333796778950070167408874398723214755352342048420236509233384060504228691247439421717776145154660819665260614606719030374746157097188777077905502366283706404249089084254210184487000990590270597382395207166506919474285640547576022841376382228267993104083461046139626378377974880966684427584303435662417721364008851870996677773917720510662526494737368571401785448409850024786090719768664502422761048062510586525467980024015286711938702512216482448086269597385419099772350149085440682892594663347642016624766961661170116360402443166746640256191226904369488864228395770803375247648092252065676886829888128110190309444, 11462478619099457240194769131836026270676403653501558282234968840872201162571883741201212219688281503510052098158124641727050288323198630131726234941868641468115278637960576287497767164456374120707437312761564310114818371263585487215911621560151358932205369221540130826905285545384305252671441989503441136412038093124085709642767025279350701000689026612157516744318724863351212190331852873715100901776905551563639179863329686328110637392713048373928191537946089436183622931782516720136751294476526680955429995943935488708846823839471792834286557115607414856063416087088477870164924987940894347486987836314461869534685, 10653980645418567411513922726616332470333513058407903035252559634113729870896307952345894573596782737100406813700290955080352696027100830934620756512872071900141804524610003605512659517424571217583346011965481480902253618773638355461764615453623374981103761629025970935810383120788534231421966726189585137512500570267960570464567388134331962043004849033375701972321858826974571976630891280420154316273033822618993014775803644483310026324771611118893293874122154993194283048698946653630901390782848148154411901241076544121228997263925606737607053972716874433300890330943412885434902240474709761223385352589083032128765, 10333595582803945043794471549604060392892058436121718182876444277996436845270662996790111238164033031406294804268590041670028232929474601883136059254591114821360112812291665655800401763541770303414040301090112758998311872983916961222346986656419661796203670733971009015803316347392237554891453769853704667050186727532712938810529943794137758599829378190680080965770951235622571154549350843468969908612054253674618037317066245764371279129776346266283585071808588302272504846382220877158974560863342504477881966924796683784677005619901829479041024077089614741081459831955279053575767736159622130675063748407061992052183]
comm = (10564327899571559803556847534640695884330979746141728381165331691371976198263843416751526335144564535035858053981517608346244582495510435781708514545410097533789005704048949775023251844189682064338358890427739102350645579483449459063227298628580813444257846278172112872070476617876388978632815732351176279459891770448714218081580878962036244554120215500496692247248020278906488898449151646331624912262205484811525189621806737849258225367134474296238235621600330628737449413319226263301240126177028279222960781645584351180328940683511286708507993883536602761937997289906562917482293638052704507924397633424367496240964, 4387528105610677136382722097833805553385843892958316305467187670486199250717569327341072891778254838060236323831885558131143386943636641524724956236926177315970135623681789134933521529522559017273929375073606157451115549453689875510487618793700227395725601364775309166607448269494881759434610031015774783174435486283695473704010367742281324624499239551547535691273360430539739519609019906949849114055192830821910951442964212279996201740422429695430649919698399420612775831374301153008912976259171898412262142433496285240507322095993886385920265570293733256427242653393188675651145896591757150999795300092930798687689)
'''
记录解法:
已知:
c
1
≡
m
d
+
k
8
+
k
4
+
k
2
(
m
o
d
n
)
c_1\equiv m^d+k^8+k^4+k^2\pmod{\begin{array}{c}n\\\end{array}}
c1≡md+k8+k4+k2(modn)
c
2
≡
p
o
l
y
0
+
p
o
l
y
1
⋅
k
+
p
o
l
y
2
⋅
k
2
+
p
o
l
y
3
⋅
k
3
+
p
o
l
y
4
⋅
k
4
+
p
o
l
y
5
⋅
k
5
+
p
o
l
y
6
⋅
k
6
+
p
o
l
y
7
⋅
k
7
(
m
o
d
n
)
c_2\equiv poly_0+poly_1\cdot k+poly_2\cdot k^2+poly_3\cdot k^3+poly_4\cdot k^4+poly_5\cdot k^5+poly_6\cdot k^6+poly_7\cdot k^7\mathrm{~(mod~}n)
c2≡poly0+poly1⋅k+poly2⋅k2+poly3⋅k3+poly4⋅k4+poly5⋅k5+poly6⋅k6+poly7⋅k7 (mod n)
可以得到三个等式:
1.
f
1
(
k
)
≡
∑
i
=
0
7
p
o
l
y
i
k
i
−
c
2
(
m
o
d
n
)
1. f_1(k) \equiv\sum_{i=0}^7poly_ik^i-c_2\mathrm{~(mod~}\mathrm{~}n)
1.f1(k)≡∑i=07polyiki−c2 (mod n)
2.
f
2
(
m
)
≡
(
p
a
d
(
m
)
)
233
−
c
(
m
o
d
n
)
2. f_2(m)\equiv(pad(m))^{233}-c\mathrm{~(mod~}n)
2.f2(m)≡(pad(m))233−c (mod n)
3.
m
≡
(
c
1
−
k
8
−
k
4
−
k
2
)
e
(
m
o
d
n
)
3. m\equiv(c_1-k^8-k^4-k^2)^e\mathrm{~(mod~}\mathrm{~}n)
3.m≡(c1−k8−k4−k2)e (mod n)
直接把
3
式带到
2
式中会导致
f
2
的度过高,所以优化一下
已知
f
1
(
k
)
=
k
n
,又知道在模
k
n
下满足的式子在模
n
下一定成立,故把
m
带入
f
2
再模上多项式
f
1
这样
f
2
的度就低于
8
,然后联立它和
f
1
差不多就能求出
k
了
(
里面的
p
a
d
d
i
n
g
部分浅爆一下就行
)
直接把3式带到2式中会导致f_2的度过高,所以优化一下\\ 已知f_1(k) = kn,又知道在模kn下满足的式子在模n下一定成立,故把m带入f_2再模上多项式f_1\\ 这样f_2的度就低于8,然后联立它和f_1差不多就能求出k了\\ (里面的padding部分浅爆一下就行)
直接把3式带到2式中会导致f2的度过高,所以优化一下已知f1(k)=kn,又知道在模kn下满足的式子在模n下一定成立,故把m带入f2再模上多项式f1这样f2的度就低于8,然后联立它和f1差不多就能求出k了(里面的padding部分浅爆一下就行)
( 不模 f 1 , 直接模 n 出不来结果,试过,不过我也不知道原因 ) (不模f_1,直接模n出不来结果,试过,不过我也不知道原因) (不模f1,直接模n出不来结果,试过,不过我也不知道原因)
exp:
# sage
from Crypto.Util.number import *
e1 = 233
c = 7252592878713436249451954839264355322580930765631177572271016442117341039243270139159572914726052278102731751307948710556102124039673892501351580382026911586520822698910216934337820791611920030598567775355231131126300774119520299748279014958652077682887635170584723744587650744421280998057075011222009042174385778453331646210379693618543179886347307521772868295540264296894711602178922977038080083149136928926845871859677401680541048431032673765061924102033485570287098238695235990854284581798656185853973943961983020641995838344765211070928405487458023474992011192333056478388071341171355197120988215168198599723008
e2 = 66193637341723367163125702898112480448278699637268148343857725442855402823431
n = 11935450457829533235861673228297207102011152676397253867146913792126035709631838912054379483925100858088716543548565883127607546205725887108101118334914085611884304295616391635635730462010491550855190770776531821441961930152081076014630292188457483421965231052149991813167636622576040955869771100692060798499848216781403839908159869808167642603742236390452605002523104832413884128824863453874477895814675168541067154527938435375815931877307360825011810649184534014412683654903241610167115302439866360069493031086872354910005880773459207712493126679315455220650236256646891830311728264963649315399787003295334546874291
poly = [11717154796621555517773089565161800782497395722578959209529354534025874232277165805913450430518606899030436997688640019197332182511107284797218734095249300649807218465147399703372218739746124711200544753873488683088277396707752681278994522913785476758026448815685216381723435987067431688479748324396207672503845734170132747031467431651462218384749316037680784863900868165022343622041751554333022117572879116218759879246367088427084626950955537463817968031017275910364363695899152710198165120432170787171341528864286158526038651919017107408570791186937519694774479837991365808631767140379749029359380372242375950137980, 9123862087464108309368301961629788915272772896023134293061688494597654503820136260901587831268936385580664649067767056115754724046745958708702235170960467356062328703981921906752172049390790202666123073269199722768061043975957820847564911432200111405506704374689942732871658793810805164611038997319494337357970794059964303933995742679251310010710434981636137595085517852847956640902442517513717087059546226466932055404728069004610675179760781279470558117788079744090471741006843223391295194412058215189490450122125518118132532661928747925982914732441440478529947224247988342993141712946093256348898996486327422944643, 6030603763346983288102354051890376530618029881435881726123892326247756715375950846629522738204125453587401831309679161545839726580035304449416761250948280327548535169936710507270611945843758842074476358246176098954644815210291073632368712607495031631913377358289661882694855436741228045084898247782669601243425453739817361547681943880579046765521731792701727321918301930375236655162783436465648090046259078120078910758575245396369709495063070202433832221772728021708079141746515469950248160534726502810704256703088684677877258573049270790396920638239330550633086994873425126929073220720355594488969185367608970916707, 9716821256832823750824128939107476939193936880337072944057098552215636341970779759899504078211465219351423745606682464111980567519009576095570498485630378890832910178268396634042751260634975171396984879182577992189999471936271429379306815019808996603918680787757713732404409692378153404122817226376865296438358486825612038858671776168645459752591925049260849071890295705474681598072886213619765003334857584781191985867775067185431488903206792188339131394272348988190482038716689478427650052247117559254256426511237932521351563089652047479479797300938563071283204961821455011631287889953996753731046822530037290627603, 11666333796778950070167408874398723214755352342048420236509233384060504228691247439421717776145154660819665260614606719030374746157097188777077905502366283706404249089084254210184487000990590270597382395207166506919474285640547576022841376382228267993104083461046139626378377974880966684427584303435662417721364008851870996677773917720510662526494737368571401785448409850024786090719768664502422761048062510586525467980024015286711938702512216482448086269597385419099772350149085440682892594663347642016624766961661170116360402443166746640256191226904369488864228395770803375247648092252065676886829888128110190309444, 11462478619099457240194769131836026270676403653501558282234968840872201162571883741201212219688281503510052098158124641727050288323198630131726234941868641468115278637960576287497767164456374120707437312761564310114818371263585487215911621560151358932205369221540130826905285545384305252671441989503441136412038093124085709642767025279350701000689026612157516744318724863351212190331852873715100901776905551563639179863329686328110637392713048373928191537946089436183622931782516720136751294476526680955429995943935488708846823839471792834286557115607414856063416087088477870164924987940894347486987836314461869534685, 10653980645418567411513922726616332470333513058407903035252559634113729870896307952345894573596782737100406813700290955080352696027100830934620756512872071900141804524610003605512659517424571217583346011965481480902253618773638355461764615453623374981103761629025970935810383120788534231421966726189585137512500570267960570464567388134331962043004849033375701972321858826974571976630891280420154316273033822618993014775803644483310026324771611118893293874122154993194283048698946653630901390782848148154411901241076544121228997263925606737607053972716874433300890330943412885434902240474709761223385352589083032128765, 10333595582803945043794471549604060392892058436121718182876444277996436845270662996790111238164033031406294804268590041670028232929474601883136059254591114821360112812291665655800401763541770303414040301090112758998311872983916961222346986656419661796203670733971009015803316347392237554891453769853704667050186727532712938810529943794137758599829378190680080965770951235622571154549350843468969908612054253674618037317066245764371279129776346266283585071808588302272504846382220877158974560863342504477881966924796683784677005619901829479041024077089614741081459831955279053575767736159622130675063748407061992052183]
comm = (10564327899571559803556847534640695884330979746141728381165331691371976198263843416751526335144564535035858053981517608346244582495510435781708514545410097533789005704048949775023251844189682064338358890427739102350645579483449459063227298628580813444257846278172112872070476617876388978632815732351176279459891770448714218081580878962036244554120215500496692247248020278906488898449151646331624912262205484811525189621806737849258225367134474296238235621600330628737449413319226263301240126177028279222960781645584351180328940683511286708507993883536602761937997289906562917482293638052704507924397633424367496240964, 4387528105610677136382722097833805553385843892958316305467187670486199250717569327341072891778254838060236323831885558131143386943636641524724956236926177315970135623681789134933521529522559017273929375073606157451115549453689875510487618793700227395725601364775309166607448269494881759434610031015774783174435486283695473704010367742281324624499239551547535691273360430539739519609019906949849114055192830821910951442964212279996201740422429695430649919698399420612775831374301153008912976259171898412262142433496285240507322095993886385920265570293733256427242653393188675651145896591757150999795300092930798687689)
R.<x,s> = PolynomialRing(Zmod(n))
f1 = 0
for i in range(len(poly)):
f1 += poly[i] * x ^ i
f1 -= comm[1]
# 求m模f1下的e次方
f = comm[0] - x ^ 8 - x ^ 4 - x ^ 2
F = 1
for i in bin(e2)[2:][::-1]:
if i == '1':
F = (F * f) % f1
f = (f * f) % f1
for i in range(1,255):
print(i)
f = deepcopy(F)
# 爆破一下填充,带入f2,求233次
f = f * 256 ^ (255 - i) + bytes_to_long(long_to_bytes(i) * (255 - i))
FF = 1
for i in bin(e1)[2:][::-1]:
if i == '1':
FF = FF * f % f1
f = f * f % f1
f2 = FF - c
# 求f1 和 f2的结式,得到(x - k)
ans = Ideal([f1,f2]).groebner_basis()
if ans != [1]:
print(ans)
break
# python
from Crypto.Util.number import *
e2 = 66193637341723367163125702898112480448278699637268148343857725442855402823431
n = 11935450457829533235861673228297207102011152676397253867146913792126035709631838912054379483925100858088716543548565883127607546205725887108101118334914085611884304295616391635635730462010491550855190770776531821441961930152081076014630292188457483421965231052149991813167636622576040955869771100692060798499848216781403839908159869808167642603742236390452605002523104832413884128824863453874477895814675168541067154527938435375815931877307360825011810649184534014412683654903241610167115302439866360069493031086872354910005880773459207712493126679315455220650236256646891830311728264963649315399787003295334546874291
poly = [11717154796621555517773089565161800782497395722578959209529354534025874232277165805913450430518606899030436997688640019197332182511107284797218734095249300649807218465147399703372218739746124711200544753873488683088277396707752681278994522913785476758026448815685216381723435987067431688479748324396207672503845734170132747031467431651462218384749316037680784863900868165022343622041751554333022117572879116218759879246367088427084626950955537463817968031017275910364363695899152710198165120432170787171341528864286158526038651919017107408570791186937519694774479837991365808631767140379749029359380372242375950137980, 9123862087464108309368301961629788915272772896023134293061688494597654503820136260901587831268936385580664649067767056115754724046745958708702235170960467356062328703981921906752172049390790202666123073269199722768061043975957820847564911432200111405506704374689942732871658793810805164611038997319494337357970794059964303933995742679251310010710434981636137595085517852847956640902442517513717087059546226466932055404728069004610675179760781279470558117788079744090471741006843223391295194412058215189490450122125518118132532661928747925982914732441440478529947224247988342993141712946093256348898996486327422944643, 6030603763346983288102354051890376530618029881435881726123892326247756715375950846629522738204125453587401831309679161545839726580035304449416761250948280327548535169936710507270611945843758842074476358246176098954644815210291073632368712607495031631913377358289661882694855436741228045084898247782669601243425453739817361547681943880579046765521731792701727321918301930375236655162783436465648090046259078120078910758575245396369709495063070202433832221772728021708079141746515469950248160534726502810704256703088684677877258573049270790396920638239330550633086994873425126929073220720355594488969185367608970916707, 9716821256832823750824128939107476939193936880337072944057098552215636341970779759899504078211465219351423745606682464111980567519009576095570498485630378890832910178268396634042751260634975171396984879182577992189999471936271429379306815019808996603918680787757713732404409692378153404122817226376865296438358486825612038858671776168645459752591925049260849071890295705474681598072886213619765003334857584781191985867775067185431488903206792188339131394272348988190482038716689478427650052247117559254256426511237932521351563089652047479479797300938563071283204961821455011631287889953996753731046822530037290627603, 11666333796778950070167408874398723214755352342048420236509233384060504228691247439421717776145154660819665260614606719030374746157097188777077905502366283706404249089084254210184487000990590270597382395207166506919474285640547576022841376382228267993104083461046139626378377974880966684427584303435662417721364008851870996677773917720510662526494737368571401785448409850024786090719768664502422761048062510586525467980024015286711938702512216482448086269597385419099772350149085440682892594663347642016624766961661170116360402443166746640256191226904369488864228395770803375247648092252065676886829888128110190309444, 11462478619099457240194769131836026270676403653501558282234968840872201162571883741201212219688281503510052098158124641727050288323198630131726234941868641468115278637960576287497767164456374120707437312761564310114818371263585487215911621560151358932205369221540130826905285545384305252671441989503441136412038093124085709642767025279350701000689026612157516744318724863351212190331852873715100901776905551563639179863329686328110637392713048373928191537946089436183622931782516720136751294476526680955429995943935488708846823839471792834286557115607414856063416087088477870164924987940894347486987836314461869534685, 10653980645418567411513922726616332470333513058407903035252559634113729870896307952345894573596782737100406813700290955080352696027100830934620756512872071900141804524610003605512659517424571217583346011965481480902253618773638355461764615453623374981103761629025970935810383120788534231421966726189585137512500570267960570464567388134331962043004849033375701972321858826974571976630891280420154316273033822618993014775803644483310026324771611118893293874122154993194283048698946653630901390782848148154411901241076544121228997263925606737607053972716874433300890330943412885434902240474709761223385352589083032128765, 10333595582803945043794471549604060392892058436121718182876444277996436845270662996790111238164033031406294804268590041670028232929474601883136059254591114821360112812291665655800401763541770303414040301090112758998311872983916961222346986656419661796203670733971009015803316347392237554891453769853704667050186727532712938810529943794137758599829378190680080965770951235622571154549350843468969908612054253674618037317066245764371279129776346266283585071808588302272504846382220877158974560863342504477881966924796683784677005619901829479041024077089614741081459831955279053575767736159622130675063748407061992052183]
comm = (10564327899571559803556847534640695884330979746141728381165331691371976198263843416751526335144564535035858053981517608346244582495510435781708514545410097533789005704048949775023251844189682064338358890427739102350645579483449459063227298628580813444257846278172112872070476617876388978632815732351176279459891770448714218081580878962036244554120215500496692247248020278906488898449151646331624912262205484811525189621806737849258225367134474296238235621600330628737449413319226263301240126177028279222960781645584351180328940683511286708507993883536602761937997289906562917482293638052704507924397633424367496240964, 4387528105610677136382722097833805553385843892958316305467187670486199250717569327341072891778254838060236323831885558131143386943636641524724956236926177315970135623681789134933521529522559017273929375073606157451115549453689875510487618793700227395725601364775309166607448269494881759434610031015774783174435486283695473704010367742281324624499239551547535691273360430539739519609019906949849114055192830821910951442964212279996201740422429695430649919698399420612775831374301153008912976259171898412262142433496285240507322095993886385920265570293733256427242653393188675651145896591757150999795300092930798687689)
k = n - 11935450457829533235861673228297207102011152676397253867146913792126035709631838912054379483925100858088716543548565883127607546205725887108101118334914085611884304295616391635635730462010491550855190770776531821441961930152081076014630292188457483421965231052149991813167636622576040955869771100692060798499693960184446731314918105642113926187107833337161524510120603332593906360209185930338647472196619213478020597693556397507575990827712746479989636430658680762894157884135805985796209803194138514597265621623815104440785237530400299161579990533910282443770714101522282163174088074769666145653173062992665886703602
mm = pow((int(comm[0]) - pow(k,8,n) - pow(k,4,n) - pow(k,2,n)) % n,e2,n)
print(long_to_bytes(mm))
# flag{7c95453a-e577-40d8-9ad0-993655b83b69}
另一种解法
利用伴随矩阵
1.
f
1
(
k
)
≡
∑
i
=
0
7
p
o
l
y
i
k
i
−
c
2
(
m
o
d
n
)
1. f_1(k) \equiv\sum_{i=0}^7poly_ik^i-c_2\mathrm{~(mod~}\mathrm{~}n)
1.f1(k)≡∑i=07polyiki−c2 (mod n)
2.
f
2
≡
m
d
+
k
8
+
k
4
+
k
2
−
c
1
(
m
o
d
n
)
2. f_2\equiv m^d + k^8 + k^4 + k^2 - c_1 \pmod n
2.f2≡md+k8+k4+k2−c1(modn)
m
d
次数太高,我们直接将其设为变量,于是有:
3.
f
2
(
m
d
,
k
)
≡
m
d
+
k
8
+
k
4
+
k
2
−
c
1
两式联立得到关于
m
d
的多项式
h
,测试结果中得到的
h
的度是
7
故有
h
(
m
d
)
=
m
d
7
+
c
o
e
6
∗
m
d
6
+
.
.
.
+
c
o
e
1
∗
m
d
+
c
o
e
0
又知道
m
=
(
m
d
)
e
,故我们把
h
(
m
d
)
中每项升个
e
次方,就能得到一个关于
m
的多项式
和
f
(
m
)
≡
(
p
a
d
(
m
)
)
233
−
c
(
m
o
d
n
)
来个
G
C
D
便能得到
x
−
m
m^d次数太高,我们直接将其设为变量,于是有:\\ 3. f_2(md,k) \equiv md + k^8 + k^4 + k^2 - c_1\\ 两式联立得到关于md的多项式h,测试结果中得到的h的度是7\\ 故有h(md) = md^7 + coe_6 * md^6 + ... + coe_1 * md + coe_0\\ 又知道m = (md)^e,故我们把h(md)中每项升个e次方,就能得到一个关于m的多项式\\ 和f(m)\equiv(pad(m))^{233}-c\mathrm{~(mod~}n)来个GCD便能得到x - m
md次数太高,我们直接将其设为变量,于是有:3.f2(md,k)≡md+k8+k4+k2−c1两式联立得到关于md的多项式h,测试结果中得到的h的度是7故有h(md)=md7+coe6∗md6+...+coe1∗md+coe0又知道m=(md)e,故我们把h(md)中每项升个e次方,就能得到一个关于m的多项式和f(m)≡(pad(m))233−c (mod n)来个GCD便能得到x−m
如何实现?利用伴随矩阵 companion_matrix
我们求出当前多项式
h
(
m
d
)
h(md)
h(md)的伴随矩阵
C
(
h
)
C( h)
C(h),
C
(
h
)
C(h)
C(h)的特征多项式就是
h
(
m
d
)
h(md)
h(md),
C
(
h
)
C(h)
C(h)的特征值就是
h
(
m
d
)
h(md)
h(md)的解,那么
m
d
m^d
md就会是
C
(
h
)
C(h)
C(h)的对角矩阵上的一个元素。
因此我们求一个
C
(
h
)
e
C(h)^e
C(h)e,那么其对角矩阵上的一个元素就会是
(
m
d
)
e
≡
m
(
m
o
d
n
)
( m^d) ^e\equiv m \pmod n
(md)e≡m(modn),也就意味着新特征多项式的一个解是
m
m
m。
所以,我们只需要对
h
(
m
d
)
h(md)
h(md)的伴随矩阵求一个e次幂,再取其特征多项式即可得到m
he = (companion_matrix(h) ** e).charpoly()
from Crypto.Util.number import *
from tqdm import *
def GCD(g1, g2):
while g2:
g1, g2 = g2, g1 % g2
return g1.monic()
e1 = 233
c1 = 7252592878713436249451954839264355322580930765631177572271016442117341039243270139159572914726052278102731751307948710556102124039673892501351580382026911586520822698910216934337820791611920030598567775355231131126300774119520299748279014958652077682887635170584723744587650744421280998057075011222009042174385778453331646210379693618543179886347307521772868295540264296894711602178922977038080083149136928926845871859677401680541048431032673765061924102033485570287098238695235990854284581798656185853973943961983020641995838344765211070928405487458023474992011192333056478388071341171355197120988215168198599723008
e2 = 66193637341723367163125702898112480448278699637268148343857725442855402823431
n = 11935450457829533235861673228297207102011152676397253867146913792126035709631838912054379483925100858088716543548565883127607546205725887108101118334914085611884304295616391635635730462010491550855190770776531821441961930152081076014630292188457483421965231052149991813167636622576040955869771100692060798499848216781403839908159869808167642603742236390452605002523104832413884128824863453874477895814675168541067154527938435375815931877307360825011810649184534014412683654903241610167115302439866360069493031086872354910005880773459207712493126679315455220650236256646891830311728264963649315399787003295334546874291
poly = [11717154796621555517773089565161800782497395722578959209529354534025874232277165805913450430518606899030436997688640019197332182511107284797218734095249300649807218465147399703372218739746124711200544753873488683088277396707752681278994522913785476758026448815685216381723435987067431688479748324396207672503845734170132747031467431651462218384749316037680784863900868165022343622041751554333022117572879116218759879246367088427084626950955537463817968031017275910364363695899152710198165120432170787171341528864286158526038651919017107408570791186937519694774479837991365808631767140379749029359380372242375950137980, 9123862087464108309368301961629788915272772896023134293061688494597654503820136260901587831268936385580664649067767056115754724046745958708702235170960467356062328703981921906752172049390790202666123073269199722768061043975957820847564911432200111405506704374689942732871658793810805164611038997319494337357970794059964303933995742679251310010710434981636137595085517852847956640902442517513717087059546226466932055404728069004610675179760781279470558117788079744090471741006843223391295194412058215189490450122125518118132532661928747925982914732441440478529947224247988342993141712946093256348898996486327422944643, 6030603763346983288102354051890376530618029881435881726123892326247756715375950846629522738204125453587401831309679161545839726580035304449416761250948280327548535169936710507270611945843758842074476358246176098954644815210291073632368712607495031631913377358289661882694855436741228045084898247782669601243425453739817361547681943880579046765521731792701727321918301930375236655162783436465648090046259078120078910758575245396369709495063070202433832221772728021708079141746515469950248160534726502810704256703088684677877258573049270790396920638239330550633086994873425126929073220720355594488969185367608970916707, 9716821256832823750824128939107476939193936880337072944057098552215636341970779759899504078211465219351423745606682464111980567519009576095570498485630378890832910178268396634042751260634975171396984879182577992189999471936271429379306815019808996603918680787757713732404409692378153404122817226376865296438358486825612038858671776168645459752591925049260849071890295705474681598072886213619765003334857584781191985867775067185431488903206792188339131394272348988190482038716689478427650052247117559254256426511237932521351563089652047479479797300938563071283204961821455011631287889953996753731046822530037290627603, 11666333796778950070167408874398723214755352342048420236509233384060504228691247439421717776145154660819665260614606719030374746157097188777077905502366283706404249089084254210184487000990590270597382395207166506919474285640547576022841376382228267993104083461046139626378377974880966684427584303435662417721364008851870996677773917720510662526494737368571401785448409850024786090719768664502422761048062510586525467980024015286711938702512216482448086269597385419099772350149085440682892594663347642016624766961661170116360402443166746640256191226904369488864228395770803375247648092252065676886829888128110190309444, 11462478619099457240194769131836026270676403653501558282234968840872201162571883741201212219688281503510052098158124641727050288323198630131726234941868641468115278637960576287497767164456374120707437312761564310114818371263585487215911621560151358932205369221540130826905285545384305252671441989503441136412038093124085709642767025279350701000689026612157516744318724863351212190331852873715100901776905551563639179863329686328110637392713048373928191537946089436183622931782516720136751294476526680955429995943935488708846823839471792834286557115607414856063416087088477870164924987940894347486987836314461869534685, 10653980645418567411513922726616332470333513058407903035252559634113729870896307952345894573596782737100406813700290955080352696027100830934620756512872071900141804524610003605512659517424571217583346011965481480902253618773638355461764615453623374981103761629025970935810383120788534231421966726189585137512500570267960570464567388134331962043004849033375701972321858826974571976630891280420154316273033822618993014775803644483310026324771611118893293874122154993194283048698946653630901390782848148154411901241076544121228997263925606737607053972716874433300890330943412885434902240474709761223385352589083032128765, 10333595582803945043794471549604060392892058436121718182876444277996436845270662996790111238164033031406294804268590041670028232929474601883136059254591114821360112812291665655800401763541770303414040301090112758998311872983916961222346986656419661796203670733971009015803316347392237554891453769853704667050186727532712938810529943794137758599829378190680080965770951235622571154549350843468969908612054253674618037317066245764371279129776346266283585071808588302272504846382220877158974560863342504477881966924796683784677005619901829479041024077089614741081459831955279053575767736159622130675063748407061992052183]
comm = (10564327899571559803556847534640695884330979746141728381165331691371976198263843416751526335144564535035858053981517608346244582495510435781708514545410097533789005704048949775023251844189682064338358890427739102350645579483449459063227298628580813444257846278172112872070476617876388978632815732351176279459891770448714218081580878962036244554120215500496692247248020278906488898449151646331624912262205484811525189621806737849258225367134474296238235621600330628737449413319226263301240126177028279222960781645584351180328940683511286708507993883536602761937997289906562917482293638052704507924397633424367496240964, 4387528105610677136382722097833805553385843892958316305467187670486199250717569327341072891778254838060236323831885558131143386943636641524724956236926177315970135623681789134933521529522559017273929375073606157451115549453689875510487618793700227395725601364775309166607448269494881759434610031015774783174435486283695473704010367742281324624499239551547535691273360430539739519609019906949849114055192830821910951442964212279996201740422429695430649919698399420612775831374301153008912976259171898412262142433496285240507322095993886385920265570293733256427242653393188675651145896591757150999795300092930798687689)
P = Zmod(n)["md,k"]
md, k = P.gens()
# 或者:
# P.<md, k> = PolynomialRing(Zmod(n))
# md, k = P.gens()
f = md + k**8 + k**4 + k**2 - comm[0]
g = sum([poly[i] * k**i for i in range(len(poly))]) - comm[1]
h = f.sylvester_matrix(g, k).det().univariate_polynomial().monic()
h_coefficients = h.coefficients()
# 里面f.sylvester_matrix(g, k) = g.sylvester_matrix(f, k)
final = (companion_matrix(h_coefficients) ** e2).charpoly() # md伴随矩阵e次幂的特征根
# padding部分爆破
for i in trange(1,255):
f1 = ((x * 256 ^ (255 - i) + bytes_to_long(long_to_bytes(i) * (255 - i))) ^ e1 - c).univariate_polynomial() # 创建一元多项式
mm = GCD(M, f1)
print(mm)
if mm not in ZZ:
m = int(-mm.monic()[0])
print(long_to_bytes(m))
break
# flag{7c95453a-e577-40d8-9ad0-993655b83b69}
[2024HZNUCTF 决赛] ezmath
题目描述:
from hashlib import md5
from Crypto.Util.number import *
from secret import flag,a,b,c
n = getPrime(512)
assert n == a**2 + b**2 * c**2
assert flag == "HZNUCTF{"+ md5(str(a+b+c).encode()).hexdigest() + "}"
# n =10025528183022843297972893037004274434565776775894832972425335533530501283241358450613164144702044922014938018419602889154405001125828093273180244377985061
题目分析:
我还在那推来着,结果是用库函数直接梭
from hashlib import md5
n =10025528183022843297972893037004274434565776775894832972425335533530501283241358450613164144702044922014938018419602889154405001125828093273180244377985061
a,b,c = three_squares(n) # 用于找到一个给定整数的三个平方数的和
flag = "HZNUCTF{"+ md5(str(a+b+c).encode()).hexdigest() + "}"
print(flag)
# HZNUCTF{55d1c6086bf65f7416ae547ca4adaaa0}
浅记一下
关键词:
d高位攻击,d低位攻击,剪枝,伴随矩阵 companion_matrix,groebner_basis,sylvester_matrix,three_squares