做题杂记666

[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=pq那么联立leak2n2%2624即可得到pq的低位之后copper一下即可得到完整的pq
思路和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}} c1md+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) c2poly0+poly1k+poly2k2+poly3k3+poly4k4+poly5k5+poly6k6+poly7k7 (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=07polyikic2 (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))233c (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(c1k8k4k2)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=07polyikic2 (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.f2md+k8+k4+k2c1(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+k2c1两式联立得到关于md的多项式h,测试结果中得到的h的度是7故有h(md)=md7+coe6md6+...+coe1md+coe0又知道m=(md)e,故我们把h(md)中每项升个e次方,就能得到一个关于m的多项式f(m)(pad(m))233c (mod n)来个GCD便能得到xm

如何实现?利用伴随矩阵 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)em(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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值