D^3CTF2022 Crypto 复现

没什么师傅出后面题的wp什么的,题目质量确实高

d3factor

from Crypto.Util.number import bytes_to_long, getPrime
from secret import msg
from sympy import nextprime
from gmpy2 import invert
from hashlib import md5

flag = 'd3ctf{'+md5(msg).hexdigest()+'}'
p = getPrime(256)
q = getPrime(256)
assert p > q
n = p * q
e = 0x10001
m = bytes_to_long(msg)
c = pow(m, e, n)

N = pow(p, 7) * q
phi = pow(p, 6) * (p - 1) * (q - 1)
d1 = getPrime(2000)
d2 = nextprime(d1 + getPrime(1000))
e1 = invert(d1, phi)
e2 = invert(d2, phi)

print(f'c = {c}')
print(f'N = {N}')
print(f'e1 = {e1}')
print(f'e2 = {e2}')

先看这个简单的,稍微推导+small_roots

\noindent \\ e_1*d_1=1 \mod \phi\\ e_2*d_2=1\mod \phi\\ d_1-d_2=1000bits

构造d1-d2

e_2*e_1*d_1-e_1*e_2*d_2=e_1*e_2*(d_1-d_2)=e_2-e_1\mod \phi

考虑到d1-d2 1000bits,取更小的mod

e_1*e_2*x-e_2+e_1=0\mod\ p^{r-1}

from Crypto.Util.number import bytes_to_long, getPrime
from gmpy2 import *
c = 2420624631315473673388732074340410215657378096737020976722603529598864338532404224879219059105950005655100728361198499550862405660043591919681568611707967
N = 1476751427633071977599571983301151063258376731102955975364111147037204614220376883752032253407881568290520059515340434632858734689439268479399482315506043425541162646523388437842149125178447800616137044219916586942207838674001004007237861470176454543718752182312318068466051713087927370670177514666860822341380494154077020472814706123209865769048722380888175401791873273850281384147394075054950169002165357490796510950852631287689747360436384163758289159710264469722036320819123313773301072777844457895388797742631541101152819089150281489897683508400098693808473542212963868834485233858128220055727804326451310080791
e1 = 425735006018518321920113858371691046233291394270779139216531379266829453665704656868245884309574741300746121946724344532456337490492263690989727904837374279175606623404025598533405400677329916633307585813849635071097268989906426771864410852556381279117588496262787146588414873723983855041415476840445850171457530977221981125006107741100779529209163446405585696682186452013669643507275620439492021019544922913941472624874102604249376990616323884331293660116156782891935217575308895791623826306100692059131945495084654854521834016181452508329430102813663713333608459898915361745215871305547069325129687311358338082029
e2 = 1004512650658647383814190582513307789549094672255033373245432814519573537648997991452158231923692387604945039180687417026069655569594454408690445879849410118502279459189421806132654131287284719070037134752526923855821229397612868419416851456578505341237256609343187666849045678291935806441844686439591365338539029504178066823886051731466788474438373839803448380498800384597878814991008672054436093542513518012957106825842251155935855375353004898840663429274565622024673235081082222394015174831078190299524112112571718817712276118850981261489528540025810396786605197437842655180663611669918785635193552649262904644919

PR.<x> = PolynomialRing(Zmod(N))
f=e1*e2*x-e2+e1
res=f.monic().small_roots(X=2^1000,beta=0.44)[0]
p=iroot(gcd(ZZ(f(res)),N),6)[0]
q=N//p^7
assert p^7*q==N
d=inverse(0x10001,(p-1)*(q-1))
long_to_bytes(ZZ(pow(c,d,p*q)))

d3bug

from Crypto.Util.number import *
from secret import flag
assert flag.startswith("D3CTF{")
assert flag.endswith("}")
message = bytes_to_long(flag[6:-1])
assert message < 2**64
mask = 0b1010010000001000000010001001010010100100000010000000100010010100

def lfsr_MyCode(R,mask):
    output = (R << 1) & 0xffffffffffffffff
    i = (R ^ mask) & 0xffffffffffffffff
    lastbit = 0
    while i != 0:
        lastbit ^= (i & 1)
        i = i>>1
    output ^= lastbit
    return (output,lastbit)

def lfsr_CopiedfromInternet(R,mask):
    output = (R << 1) & 0xffffffffffffffff
    i = (R & mask) & 0xffffffffffffffff
    lastbit = 0
    while i != 0:
        lastbit ^= (i & 1)
        i = i>>1
    output ^= lastbit
    return (output,lastbit)

f=open("standardResult","w")
R=message
for i in range(35):
    (R, out) = lfsr_CopiedfromInternet(R,mask)
    f.write(str(out))
f.close()

f=open("myResult","w")
R=message
for i in range(35):
    (R, out) = lfsr_MyCode(R,mask)
    f.write(str(out))
f.close()

LFSR流密码

我们把它看成在mod2下的加法乘法问题就好解了许多

\noindent \\ m1\wedge m2=m1+m2\mod 2\\m1\cap m2=m1\times m2\mod 2

先看mycode

\noindent \\ S_1=(R_1\wedge M_1)\wedge ......\wedge (R_{64}\wedge M_{64})\\ S_2=(R_2\wedge M_1)\wedge ......\wedge (R_{64}\wedge M_{63})\wedge (S_{1}\wedge M_{64})\\ .........

改成加法

\noindent \\ S_1=R_1+...+R_{64}+sum(mask)\mod 2\\ S_2=S_1+R_2+...+R_{64}+sum(mask)\mod 2\\ S_1+S_2==R_1+S_1\\ S_2=R_1

泄露高34位

标准结果

\noindent \\ S_1=(R1\cap M_1)\wedge ...\wedge(R_{64}\cap M_{64})\\ S_2=(R2\cap M_1)\wedge ...\wedge(R_{64}\cap M_{63})\wedge (S_1\cap M_{64})\\...\\...

改成mod2加法

S_1=\begin{pmatrix}R_1&R_2&\cdots&R_{64}\end{pmatrix}*\begin{pmatrix}M_1\\M_2\\\vdots\\M_{64}\end{pmatrix}

S_2=\begin{pmatrix}R_2&R_3&\cdots&R_{64}&S_1\end{pmatrix}*\begin{pmatrix}M_1\\M_2\\\vdots\\M_{64}\end{pmatrix}

...

...

可以写出30个等式,然后在mod2下解方程得到R35-R64

别人写的可太离谱了,用z3来弄那么多式子

exp

sr='01111101111010111000010010111001101'
mr='0100110001000110001101010101001001'
# long_to_bytes(0b01001100010001100011010101010010)
sr=list(map(int,sr))
R=list(map(int,mr))
mask='1010010000001000000010001001010010100100000010000000100010010100'
mask=list(map(int,mask))
var(' '.join(['x{}'.format(i) for i in range(1, 31)]))
R=R+[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30]
eqs=[]
for i in range(len(sr)-5):
    eqs.append((sum([k*j for k,j in zip(mask,R)])-sr[i]))
    R.pop(0)
    R.append(sr[i])
eqs
[x1 + x11 + x19 + x23 + x26 + x28 + x4 + 2,
 x12 + x2 + x20 + x24 + x27 + x29 + x5 + 5,
 x1 + x13 + x21 + x25 + x28 + x3 + x30 + x6 + 1,
 x14 + x2 + x22 + x26 + x29 + x4 + x7 + 3,
 x15 + x23 + x27 + x3 + x30 + x5 + x8 + 3,
 x1 + x16 + x24 + x28 + x4 + x6 + x9 + 2,
 x10 + x17 + x2 + x25 + x29 + x5 + x7 + 5,
 x1 + x11 + x18 + x26 + x3 + x30 + x6 + x8 + 4,
 x12 + x19 + x2 + x27 + x4 + x7 + x9 + 2,
 x10 + x13 + x20 + x28 + x3 + x5 + x8 + 5,
 x1 + x11 + x14 + x21 + x29 + x4 + x6 + x9 + 3,
 x10 + x12 + x15 + x2 + x22 + x30 + x5 + x7 + 4,
 x11 + x13 + x16 + x23 + x3 + x6 + x8 + 3,
 x12 + x14 + x17 + x24 + x4 + x7 + x9 + 8,
 x1 + x10 + x13 + x15 + x18 + x25 + x5 + x8 + 3,
 x11 + x14 + x16 + x19 + x2 + x26 + x6 + x9 + 4,
 x10 + x12 + x15 + x17 + x20 + x27 + x3 + x7 + 3,
 x11 + x13 + x16 + x18 + x21 + x28 + x4 + x8 + 5,
 x12 + x14 + x17 + x19 + x22 + x29 + x5 + x9 + 5,
 x10 + x13 + x15 + x18 + x20 + x23 + x30 + x6 + 5,
 x11 + x14 + x16 + x19 + x21 + x24 + x7 + 4,
 x12 + x15 + x17 + x20 + x22 + x25 + x8 + 5,
 x1 + x13 + x16 + x18 + x21 + x23 + x26 + x9 + 4,
 x10 + x14 + x17 + x19 + x2 + x22 + x24 + x27 + 4,
 x11 + x15 + x18 + x20 + x23 + x25 + x28 + x3 + 3,
 x12 + x16 + x19 + x21 + x24 + x26 + x29 + x4 + 4,
 x13 + x17 + x20 + x22 + x25 + x27 + x30 + x5 + 1,
 x14 + x18 + x21 + x23 + x26 + x28 + x6 + 3,
 x15 + x19 + x22 + x24 + x27 + x29 + x7 + 4,
 x1 + x16 + x20 + x23 + x25 + x28 + x30 + x8 + 5]

转成mod2矩阵然后求解

v=[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30]
M = Matrix(GF(2),30,30)
b= vector(GF(2),30)
for i in range(len(eqs)):
    temp=[0]*len(v)
    for index,j in enumerate(v):
        if str(j)+' ' in str(eqs[i]):
            temp[index]=1
    b[i]=-int(str(eqs[i]).split(' + ')[-1]) 
    print(temp)
    M[i]=temp
# M.str(),b
res=M**(-1)*b
#(1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1)
long_to_bytes(int(mr+''.join(str(bit) for bit in res),2))
#b'LF5Rsuk!'

equivalent

好像背包密码,但是维度大,肯定解不了。看了wp还是很懵逼,正交矩阵什么的。

这里贴一个非预期,自己不知道怎么滴捣鼓出来的,原理我也不懂,要是有佬路过还请帮忙看一看

通过LLL找到M的一个较小的线性组合来表示Si(可能有2大小的误差),然后这个线性组合满足题目的sum(vector) %2=m

exp非预期

from Crypto.Util.number import *
M=[109222967035654784066932309, 38447200945965624379449963, 15956349759252734075126480, 9269095311686826370633133, 60024886978948637767923150, 87597063423308969267959838, 100210416511638532646338334, 50709701744850869953906177, 17268432887469442081067657, 74088867573815737209230852, 90758244977957941230888765, 68418537912613344507377135, 76041055914464071021746023, 11300880106439766134192277, 2977536822553240361332788, 75612578465901052365710638, 102107120073571320569282893, 5574467202458891060192942, 20752542552173633278903107, 41534893769815107211971799, 50382466800077902492703134, 81726632327456413136555452, 36129876051604599051710867, 99314327166152638284733134, 27491179505586026213212524, 72351987521570792374168568, 48395764966292811087615712, 96159090973181052843090018, 33780440393369235622727032, 114442951330343579223582453, 5159833409299959428624681, 40492216160318344247184165, 36530942424325343897970381, 74847019068476522660786887, 14981049988137611238774549, 30772237699211176071041692, 87998113967498658498717704, 40923934204310477374468696, 53527657237687649920069875, 19151598930396608443349190, 73804910162405574977641087, 75858410466545917699619976, 73009662036727172449940698, 74613396247243857083390028, 56238790473534077038070136, 38815259308462705768653874, 20153853624382705012264602, 78867242873885830104160994, 98847507947516433356127406, 71292972603821601570690892, 38681501117689450863497936, 55881459327531544145991900, 60989207858662263031721622, 91662212116264769034408641, 35723145975974953024490151, 50541376344047304889615157, 51186992879274224629542677, 41582027743313078008170664, 87060537090820730297265864, 14160890385258136432036956, 87594674784032315701460171, 73302362828417845372187487, 57108593549651629799749692, 36904832707291703856186627, 28737678040892682795643445, 94746109501398552602005815, 117339940989508699561350, 12585299149839371455186989, 78265417127556391654496770, 100385643306096336568373798, 61469108268747256739834562, 32150917279340250456699281, 50751926985820503416637672, 19548780035629316207698688, 50777628351641993992116803, 18688106208115146505032200, 105190011910657914968400065, 28305142081773220849277466, 7177195092206711341539331, 66282658135413479799859826, 25571443212853818086091616, 43158056299309613550445634, 30700285182681228939970369, 68880054802568768624970569, 34589073299981874272336995, 79150710139301772407704119, 34316405932351570849556917, 5057144107081404906900094, 39955848364342415062257196, 69200653788996692206461892, 107115624193886470174167889, 4037617016102147312207128, 75273483561351574179917257, 47775776782853769382575151, 97070723554106227396112649, 111981577442424122139837898, 106681534331367257893113485, 14356164134140718065674510, 35375762678645529614348324, 10553700092044779999310854]
S = [2714497948099380420470240673, 2389183014869957555444531108, 2933505453530698005021344018, 2255373013830483326309292361, 3171360912979984061574019471, 2751760238954233062245614745, 2418578888231065327952833618, 2172294890114584407346325873, 2702311660585646265365836027, 2263263986326909099018478128, 2110038193864999055065525133, 2366837785607597506418782105, 2804185826002625781727495287, 2265995991195637708093330377, 3054838824350439674446651776, 2513228358292868914376762421, 2982133814586321026005662811, 2442493406764562516864044096, 2863615171778072284918902489, 3330788753392339818083095387, 2681901082115954092033577689, 2728892363850740372414773868, 3043124450419008713317761588, 2581039208909805363173831817, 2499349734625553317971020122, 2381555144891006076117534565, 2351869819730211021201503023, 2587875939895638792733042760, 2845230390755251354954181634, 2712218131775553257810816142, 2889825451683978382217277306, 3045577564276173428898540826, 2086378977500562760142011897, 2861007216350635527525041957, 2606064299840915204489277550, 2707621666268897653236311999, 2708639633127546374812116081, 2805904518731602185668358602, 2411593148606998786368025796, 2615538445834860657740795008, 2529451850915291742552421106, 2398507631158096963929171638, 2589644886679174329076451487, 2500935368745804055251330836, 3472109609228258736299453846, 2824109477931070192126515296, 2766264135621319438486098876, 2944077201286522830337048939, 2529399003138731782699669956, 2925600724721401597205362127, 2340903235633892134091801834, 2716209661267343234042740497, 2724963489717995942648268480, 3255943392865983912403150841, 2885543568831134391278021429, 2773171006763287739767475859, 2795100134714304937399888872, 2721060575428992908160117573, 2385639017733967768368608570, 2037503380619332403728442637, 2649425312656429016665399514, 2907210979142131101038323112, 2608214043686672738129135969, 2897682119994320622035543373, 2191007553943071085967518723, 2777836658369529865911380407, 2651723915572800082617250013, 3306968006236351863604919748, 2716529992181230272574832166, 2901529939533782492577071608, 1962783962707144712801914368, 2564008037736914714045521355, 2303684063121850890383665347, 2661569018552536100296806658, 2774225274984960579739469335, 2339688568243827067843845551, 2022220946453960452426062099, 2538319542721955073299294206, 2649691877475341163637948885, 2642232646473149856785446610, 2970802690942325286750537877, 2217696195383992414517766118, 2606256900872475000235139564, 2264078001995969717287914495, 2485423726684045664534864539, 2558712997973510045589241306, 2707485450899719650078366435, 2354080488123944092680261240, 2711441951342932268723196417, 2899873952918355311658672546, 3041290391798678805584552953, 2436673014940573500280686011, 2621759418064909165875497237, 2585415709976946453826167115, 2733250933461805682230839120, 2601117557152064904126212671, 2387295351222117970861371125, 2104812266499111718580360444, 3211561474919233922291606339, 2823652498652237991514353347, 2937190320245182590499003918, 2912340399043091631820211890, 3344820583707005270403484682, 2635842942865968490910214379, 2160049133778494529589784297, 2108792869359801195324150223, 2112327437111310734233071195, 3241681687828348761566521689, 2721602623827079352181395845, 2363815653384492774898742832, 2685127502149807801838452312, 2454180486498734280115109826, 2325145253843188740758428460, 2858223170993220031333523365, 2617524874514682188992414452, 2539924929665600310067812148, 2381283133857171106179244396, 2936376309752167694895692013, 2524245610709007539248726790, 2079845765953648779306980948, 2580547951876077191654476880, 3283377577358066609503272196, 2814743539394865322226769912, 2637986325805444237697392216, 3046183059254571673911810677, 2881594321362616003947272234, 2508931032991222934378635894, 3060993606254451710496781775, 2862265526315604063938412347, 3141877893417982544208409136, 2543807518686511187397521753, 2346753270596655472515883056, 2720658986451462117284064462, 2577117459186739219604417731, 3095542110387796007581094748, 3248509724923983501922074981, 2344064549558895587318379930, 2599911869373403483150142559, 3225652814275175313593991151, 2315104859415825574094301466, 3168822139353115432516140600, 2660632303920120970787302693, 2649063984921820850529329602, 2475506037831477854077534566, 2491282302354215681941596760, 2654018965222620819893592258, 2266895492052363945256389226, 2089058264458522382915326557, 2612574913077773280367586796, 2522627748292326445484931180, 2512752224650290926563330081, 2506823327047486986432063805, 2937098479786032316752197743, 2994035278776953068461797438, 2318313365930110356641411588, 3024979045693707244882912965, 2743493222241550972692706965, 2843028513988765979681906191, 2608688983067148417907317238, 3088830025686275258830763031, 2773812190125050480947256165, 2670490157770787305967553754, 2851587673711150270602903796, 2436774438306790946797530699, 3214713729808048889464423228, 2727179824532769629242333298, 2750154436855752590422430804, 2599916978155774250856921439, 3062753926738274504973463537, 2483389799210916882539797909, 3203505944107806190722948577, 2426151817188787589138220117, 2993430514491437036275520595, 2705653833831422724443176698, 2642807951092874534609148047, 2871363486078571723056976267, 2605590912752527866553047452, 2684664550471028287227303015, 2662748200049765992908470029, 2665848094244084292916261390, 2761476734372517510121589231, 2898700490801948420307514276, 2756155381747234232214952133, 2511528712323486336724787669, 2701385602040653710335716768, 2647723920191313259918406716, 2739899255894826851191805551, 3216364951985081581942418958, 2897910350082476458640377992, 2450970263707833013226687022, 2973483339126208034272117255, 3036452375778901995759968364, 2296077514108423325558752030, 2866977126028987066219145777, 2291099522934479900206494450, 3233315074729014718869478444, 2223888548664618930292722628, 2868669721440084388621462719, 2822548261222026288691066587, 2755678541446644051887072520, 2432654542482207443971615235, 2386972937818031105804316534, 2275475888505867017440747664, 2402679606127251568824542091, 2508111675853091987580170186, 2363079893939317303726734266, 2492880968293512639247397829, 2627040667155066448559341590, 2588542124156149601517812589, 3049575703325225649744577824, 3066264104579774789044277629, 2048740445924734529714055783, 2175145737567351175480644171, 2917897605641563564494198948, 2977788050307674337807261756, 2750198067198216675069282137, 3269878506780023665557909333, 3223136627409870233499001478, 2453951933798200360519332674, 2360753301091952749922110849, 2735744509873945686318118135, 2701649891901645231069525793, 3024469347313164764235888147, 3057311780007644269650711364, 2682879019786747153376351893, 2299095816215290556933277304, 2746475580591867834930156142, 2972684140585541353223920770, 2677656872856708597698726376, 2279391611268720898497222438, 2645696731152545088801085787, 2627607874590255892310628221, 2648702227521085892144631368, 3012431443879537185857487833, 3334019867013465231373871626, 2568508731821028540281797761, 2509443981443768752870659543, 2466937634658092257360341194, 2600123449725076966656262142, 2354080420670734657721664246, 2517131473611610424369527724, 2252148818445898318328238255, 2738836253285752527865050125, 1925848510546164708107447444, 2221423791362127830556699763, 2549163068106261738993177255, 2307944215436629960872288039, 2799662040657025994571666303, 1997758162092442144051381176, 2927886882492866864028576349, 2069960744220991389926282808, 2610269152796845333558883689, 2482281883421479715283244379, 2858295051878677901646471093, 2483871466559186677679708360, 2739526844049606131909444143, 2548877528562426219415995662, 2628424406128088800389069543, 3101439805846555612828474911, 2331860391060383856825868464, 2576086603436824160253085256, 2724109540583752928069148742, 2351369993525320022256675569, 2745253660360963739692152442, 2619686157379598129272270216, 2740920101610352548576667098, 2479030188388827420892494845, 2557457325931788443200958619, 2707157719780654853113857934, 2913364347906878530297424178, 2504835841421645931233278637, 3250333745982541471145985432, 2470595100108199655581050665, 2817159143722767904852665804, 2462052230972657093668891744, 2611471087045622692272554002, 2844866488459911831616841059, 2534052319327474361735489690, 2429924495923689721946963701, 2916514156636848937181338241, 2566044754187277472878737881, 2728806102414746710710664120, 2715578946379167891239404717, 2653175854439256979221735319, 2570848917409470249160474045, 2615730461936043188443546171, 2424225477766888500745694615, 2889510614697904719010547602, 2841349849471612844349057101, 2313403965676959163780842421, 2203767959071944547129280725, 2450887670621924982098459436, 3176772187672891535795962900, 2606331979237832951501397036, 2441973732039621640543425948, 2207843632840340614678493195, 2603297488965407178632056914, 3345048916985115695467434502, 2688860981696225751095514438, 2381544763606512827742274136, 2399784123684851279650437219, 2283450812425967876015405387, 2770574677108860192539175601, 3420688443978283994213514488, 3041006691624856845838832683, 2731318855967306960438843418, 3193433599623772842788586288, 2547482305130953070545762857, 2902575298729427897997357270, 3047568026118090489728723702, 2844867589727036549910215176, 2611172487116319502094500382, 2388777586967694990326051459, 2520758750519897995026138890, 2519563130194407217928907171, 2609177797386276844245814325, 2764769150535354476328617585, 3115793257358444672018963001, 3278934117620837703888653191, 2670588462714791254285782894, 2389582280318573503153324810, 3236344532191535442176523565, 2930575864071076944174962744, 2444563577173557209344602288, 2889921659276708123281415428, 2940296862563634157820447811, 2890788196797605094777654206, 3162721338518607691080436400, 2651614155989679523334024340, 2648100425894715751511203212, 2110077139710705424992879647, 2734839642969539327834530575, 2834197120172592857812014269, 2632341598347038167362226181, 2813299454755879897626683485, 2730377000798100217501398858, 2794291740362185070548236568, 2554499075675627850123141962, 3050767638782972144174767062, 2548811268726841185274034337, 2749583174035043179604411052, 2907657418913384462571090613, 2593668720430405656985143215, 2654717866651970913143236013, 2837146217453464489928444625, 2502852363289994070493266192, 2369427778746064652553194124, 3193563055915852516045928129, 2704650164628811445066429394, 2523305721391887976643521648, 2666684372158588515395003181, 2877016850592538653266825859, 2960550595113830758642680221, 2470676411286793598990077143, 1915687400769904985905057695, 2477406204279095920011591886, 2806782704943795810765693931, 2392949456698172456842180380, 2880869094780588064547242147, 2869903675771958530930155247, 2632406748626222244834245305, 2966976125930759655779039069, 2642504522709015592491299713, 2834241491758958981293193538, 2479200909506437277689458300, 2869247323630005595837098564, 2854884098572399559630090586, 2309126165569089968844420900, 3136128718540940961353766559, 2417440316526030531639294289, 2634155434995881092964497361, 3271923679899078453838292607, 2361944279000608292641765794, 2755757943035427358219617271, 2578064482052895521866130699, 2953059076176837002977311950, 2836793871087812976269352981, 2659887182514560776334799439, 3060061083368538939036446874, 2316746677367712143347210550, 2898546861510364448479655685, 3269579979106775574022715615, 2890484925067506427077293549, 2769101206540885894811331970, 2874380911584517046440479927, 3019621816246656971256017304, 2428563681621812089877395323, 2357511512762073701567486548, 2803233973674865663154731292, 2513809763992419014958227413, 2184965384308025948560334944, 2314304799325216329886011036, 2552216801716433021120308860, 2640979325121106843579809075, 2490197409394020716017881472, 2177214652330228267398934211, 2614249667772417290400690381, 2359018406784395465868570563, 2355233820591143658506073525]

n = len(M)
def solve(Sk):   
    Res=''
    for i in range(len(Sk)):
        L = [[0 for col in range(n+1)] for row in range(n+1)]

        for row, x in enumerate(M):
            L[row][row] = 1
            L[row][-1] = x
            # print(L[-1, row])
        L[-1][-1] = Sk[i]
        L=matrix(L)
        res=L.LLL()
        for i in res[::-1]:
            temp=-sum(k*j for k,j in zip(M,i[:-1]))
            if abs(temp-L[-1][-1])<10:
                Res+=str(sum(i[:]) %2)
                break
#     print(f'{k}:"{Res}",')
    print(long_to_bytes(int(Res,2)))
solve(S)

leak_dsa

首先是标准的dsa没什么好说的,就一个等式

\noindent \\ s\times k=m+d*r\\ k=m\times s^{-1}+d*r\times s^{-1}\mod q

现在是有70个这样的等式,类似于HNP的板子题。

但是这里k泄露的并不是高位,而是泄露K&mask。

意思是泄露k不连续的一些位数,那我们现在想办法将这个条件转化成泄露k的高位

后面的部分是参照wp写出来的。自己暂时没什么好的思路。

K=K\wedge mask+\sum_{i=0}^{t}k*2^i=leak+\sum_{i=0}^{t}k_i*2^i

对于这样的式子,由于整个式子在modq下进行,我们要能找到一个较小的2^i线性组合,就相当于抬高了leak

\noindent \\ \begin{pmatrix}2^{k0}+s_iq&\cdots&2^{kt}+s_iq\end{pmatrix}\\ M=\begin{pmatrix}q&&\\&\ddots&\\&&q \\2^{k0}&\cdots&2^{kt}\end{}

在这样的一个格上找到较短的向量v

然后找到系数g*M[-1]=v,这里g=v[0]//M[-1][0]

这样g*sum(ki*2^i)变成一个小于qbits的值,这里计算结果为251,qbits=256

官方wp的方法还在M构造时对每个2^i加了一个上界限制,能更好的找到这个g。

经过计算发现,并不是每个K-g*leak都是251位甚至更低,而是有一半左右的为256位,我猜想这里应该跟g的选取方式有关。但是一半的MSB泄露已经可以满足hnp问题了,这里注意后续求解d时要选择较低的g*sum(ki*2^i)

具体请看shal10w佬的wp

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值