defnext_prime(num: int) -> int: num = num + 2if num % 2else num + 1 whilenot isPrime(num): num += 2 return num
p = getPrime(1024) q = next_prime(getPrime(16) * p + 38219) n = p * q c = pow(E1, 65537, n) print(f'n = {n}') print(f'c = {c}') # n = 1605247600724752598798254639224215706171506359654961357324428027985787942008103766562745464838961569081446916113769517713344420113584254259000172572811154232107339480903672251992191997458469905064423618888336088652352540882576826988355783159237971043770132628344798937353150930071309347972804118952814447576207066147031238749098842662046825743988208813903138796789940911515825517078554074496474819128789835309636804325132602557092847746454786387067599510769382078521691609970320528531270474091713477040343897269903489441410062592732302402854035415438078656688806905350495825334584533345448091335565792091890185673190424063 # c = 751639057610677013264061431434189083017589908118307247217007533938435229431015858783222167911772848893015518607229280589985711010766459396989232072512314594917029375221335361209036112742388866873824163350886610514973038316512032459352053158417705406031466332440378871927174731975794579894912999936641163063898365134788537389162378185448090279397717831977803284480743612393591614284972981435749362255654561121758163485884075260156288337176713756471879489767416836868661153693157792733142765671887792303181376620864506386820826866340907593080654521498766421056474652652337037121881207188033108746890998208582406826010121861
assert E2.bit_length() == 69 ns = [getPrime(1024) * getPrime(1024) for _ inrange(3)] cs = [pow(E2, 89, n) for n in ns] print(f'ns = {ns}') print(f'cs = {cs}') # ns = [15863230586500684911356384742123404120213699052018048588650392009927565369685497256344682150189923131009586323640507773706997704860898682946308031020361302334248895233255911348365179153799197341744863134926804603973507415697810440916305092395180382239729550833607847524005391137474497849077097574452115379368463540087172800902210822143687014813631366360652583216269138116785489485772437870528892032119729929607857459621078790511144060710035933887337208301078892163837203412081114510143406013892393607932596921308889058909544584619676380766485493114814753878272881866907210235681877689493671668534251778397658670518117, 14144098469438619358682652828507744381697293556670717685553585719665002440476256008471235313826051740009083510860714991201047915737216102220242621674841600987122005914542061963618272275986835928673920375768272390912778741502655909281390948606467847118377641357547931472588836726339758576038273820470879637555458446243401248151675266602656677360819563744765522495640821496694918515669243614141704744848980746101569785439728585144841655665959389460512628800782742764147773150430552859331269667626942993392101897661719871375721143240270211821269260950380944670195863016621594387236339317938305273510719419578308449465183, 27563822879593503938377821960427219022565215631856333510782568496016547757945464794632272818101891677705256471714805217606503652132995136255720639088424576003650628211271025648183600635145895528466199068640094470078526413324708028578289949241288828542143203769199399500669311878391255837977932634772778594526940501234736059441483897017015324765266787399950699732518347518591167932031031320265136158304460199654008895095274754918153773566824931440342525688741289235153882699461549523425169846266597156773535163599640189457171272058311480951820887261040891344076039474315985825984444520336790670313179493074014037981261] # cs = [3833095607830862948079097323254872789586576953317671099752083261949616608759231291050566542764984974722790226120399722937104503590740358249900089784508490830379531632752169777949200718567033018577184658177019404903817920024468923715441355404672443007723525750768430895425376124679225715687382380114628103058312176343693900115638265002657622618744666247132114654135429040069316368839938881716554901593031901272992940200484460436193699175500376368456706998564064693820008778900344357745691652875500810447147088715289581351501876012044611990972521570253106671158207677490849249612002954497927762168699886110455354481924, 1502420121177211156091634258259634977709023894278792755694473756163084431123774101512866316989917922052023168401167212284219907272528117024670443698990238243030221117004372456475521502350404137469088570170885409265567084376069256924135270283335242133163303599239181417949980292944203204296598188175632723968779672994090788585343302473442389865459398142634104331743517384589200789331489394375604801951994831647339839112698394141328178967516636452592385248135340133712522135715943787590172334743893259621909532456281362868290556461907936774231166936915669816509378419892149164552548131776979706381641477878931403040942, 8992204063713908492214256291861339175525948946919629972908439132005643626148678347198381531633907182877152728077958345519083406637446972079387161726967295886447791613166577391233866583354793842121902234644830640050181130381996083089350911224037154798259291124104894554037604500881250119806371348673833105103600782286898276354573884788251542211434143476774391457587885772379990104835187104619922442613860682792470389490804228050671124495925536024571104944112397143299499508504917890140939438891891453283594000764399193028606955089853654071198909973555844004685149713774167524224100487937899126480545681565581673958854]
qq = getPrime(1024) nn = P * qq qqq = qq >> 460 << 460 print(f'nn = {nn}') print(f'qqq = {qqq}') # nn = 16851735797771199659625936797279158526379741298692339786049494329385618191510929735113284926125682522862667382938603116481087115598324232020838136618518964343752653000145611092980612556947954728339508416646035295651852840099205127587606898235203114875942637900167644300657599966420459187131027117268004042708998239798434578246497419547543598779697909298102358128788120332794123690714647499091326245022977970510468925837363300545900657420134894815246189043375619879915523611890538142257042753868665844692029124229028056547096764320547579965641276151760507921199827910445919017775913411823263307923216323527883262438117 # qqq = 121042531930820997492656296084544616958724191434895945419858099204426898711413526806300854553993738803031497438495403291406481997877273916883918253302909196533823945327277312672931819555344139777992801106437643790498379469530787985051569590331291422592393540391481519004782904598710037907420679190942964514816
pubkey = (65537,103894244981844985537754880154957043605938484102562158690722531081787219519424572416881754672377601851964416424759136080204870893054485062449999897173374210892603308440838199225926262799093152616430249061743215665167990978654674200171059005559869946978592535720766431524243942662028069102576083861914106412399) c = 50810871938251627005285090837280618434273429940089654925377752488011128518767341675465435906094867261596016363149398900195250354993172711611856393548098646094748785774924511077105061611095328649875874203921275281780733446616807977350320544877201182003521199057295967111877565671671198186635360508565083698058 gift = 2391232579794490071131297275577300947901582900418236846514147804369797358429972790212
pubkey = c = gift = n = pubkey[1] e = pubkey[0] import gmpy2 a = int(gmpy2.iroot(gift << 740, 2)[0]) # p-q b = int(gmpy2.iroot((gift << 740) + 4*n, 2)[0]) # p+q p_high= (a + b)//2 from Crypto.Util.number import * bits=235 p_h=p_high>> 235 << 235 R.<x>=PolynomialRing(Zmod(n)) f=p_h+x f=f.monic() res=f.small_roots(X=2^235,beta=0.4,epsilon=0.01) if res !=[]: p=int(p_h+res[0]) q=n//p phi=(p-1)*(q-1) d=inverse(e,phi) m=pow(c,d,n) print(long_to_bytes(m))
SHCTF2024
lattice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import gmpy2 from Crypto.Util.number import * from enc import flag
m = bytes_to_long(flag) n = getPrime(1024) x = getPrime(200) hint = (x*gmpy2.invert(m,n)) % n print(f'n = {n}') print(f'hint = {hint}') ''' n = 152796022093657008425867826412538793747318986175375760689024975035557838288031741295797649967106130503020117198116769417053850437691492596957416004140550460845551832242126438382622266235726472732569131412860613461542374064825092420723662225110595499077191092820532300002967577653764096759617778091966382904887 hint = 25569143938114268788879827411215745731043262260402779816783733470240028677096410812831399463104121396578625276232462330280604442741242933324330482649175337887274983300003486206478499962082352088597247874234904049860695433433317263563126535527334018280497271436453330693435700311283203594541269296512072155622 '''
我们有 hint ≡ m−1 ⋅ x (mod n)hint ⋅ m ≡ x (mod n)hint ⋅ m − k ⋅ n = x
构造格 不需要配平
1 2 3 4 5 6 7 8
from Crypto.Util.number import * n = 152796022093657008425867826412538793747318986175375760689024975035557838288031741295797649967106130503020117198116769417053850437691492596957416004140550460845551832242126438382622266235726472732569131412860613461542374064825092420723662225110595499077191092820532300002967577653764096759617778091966382904887 hint = 25569143938114268788879827411215745731043262260402779816783733470240028677096410812831399463104121396578625276232462330280604442741242933324330482649175337887274983300003486206478499962082352088597247874234904049860695433433317263563126535527334018280497271436453330693435700311283203594541269296512072155622
L = matrix([[1,hint],[0,n]]) f,g = L.LLL()[0] f=abs(f) print(long_to_bytes(f))
pading
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from Crypto.Util.number import * import gmpy2 flag = b'SHCTF{********}' assertlen(flag) == 39 p = getPrime(512) q = getPrime(512) n = p * q e = 0x3 pad = b'a_easy_problem' c = pow(bytes_to_long(flag + pad),e,n) print(f'n = {n}') print(f'c = {c}') ''' n = 109737787794968305949598228868674114597018371251979806854788490929456243836953515564749753768100090653929585848710439841326812805404713071846229799341611201345422899839869346846129523704866785092954139080698928767741795106166833882185183866759036319543323061345190111744365702185492443072749347906785496112489 c = 42085883893512048106829975452905289009909421998654249003993514427526589868716834021359088868423245181021979484900636815785724277904618157061827644640976245079056625254053678897529638103361780570361086580770984509290912588699825058783934765458424022883210844472467747148206830472515332804214348856325586329938 '''
n = 101194231761192803646875794770841105131876105333404505987513576849142365482512109876401629071314564545841743473668262668053559550015874646299248232349238400201145583346187330958825878235324968882794481192056169683711007095999439320830763275487477094590502701333963154552470777678553556993349171608134555815527 c = 54067443511581567434123971345564905390315631873898717856316286990552318113901362505672245448553258416669456882532743580961176229271906817289588426185966004215569829572814038485471312399063659287164712291139771809733004385057875146223151700601326161190474536508680332925332614914475852998934930375151571163346 e = 0x3 pad = b'a_easy_problem'
from Crypto.Util.number import * PR.<x> = PolynomialRing(Zmod(n)) f = (x *256 ** len(pad) + bytes_to_long(pad)) ** e - c
f = f.monic() root = f.small_roots(X=2**312,beta=0.9,epsilon=0.03) print(long_to_bytes(int(root[0])))
原来小e攻击在大明文下也能用copper攻击说是
ezECC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * from flag import flag assert flag.startswith(b'SHCTF{') m = next_prime(bytes_to_long(flag)) p = getPrime(512) a,b = getPrime(128),getPrime(128) E = EllipticCurve(Zmod(p),[a,b]) k = getPrime(256) A1 = E.random_point() A2 = A1*k M = E.lift_x(m) C = M+A2 print('p = ',p) print('k = ',k) print('A1 = ',A1) print('C = ',C)
p = 9799485259524549113003780400336995829253375211044694607315372450399356814285244762186468904824132005209991983177601498069896166228214442123763065076327679 k = 73771953838487511457389800773038323262861649769228176071578897500004883270121 A1 = (5945412329827707694132352090606154232045921322662767755331097180167148601629747751274580872108985870208681845078153424348847330421799769770041805208089791,4113102573821904570542216004200810877456931033522276527318388416329888348077285857968081007666714313806776668203284797556825595791189566621228705928598709) C = (2336301464307188733995312208152021176388718095735565422234047912672553316288080052957448196669174030921526180747767251838308335308474037066343018337141276,6868888273736103386336636953449998615833854869329393895956720058438723636197866928342387693671211918574357564701700555086194574821628053750572619551290025)
a = inverse(A1[0]-C[0],p)*((A1[1]**2-A1[0]**3)-(C[1]**2-C[0]**3))% p b = (C[1]**2-C[0]**3-a*C[0])%p
E = EllipticCurve(Zmod(p),[a,b])#在有限域模P下以a,b为参数生成曲线 A1 = E(A1) C = E(C) M = C-k*A1
mm = (M.xy())[0]#获取M的仿射坐标(x,y)中第一个点 for i inrange(292): m = long_to_bytes(int(mm-i)) if m.endswith(b'}'):#判断结尾 print(m)
from Crypto.Util.number import * from enc import flag
seed = bytes_to_long(flag)
a = getPrime(400) b = getPrime(400) p = getPrime(400) c = [] for i inrange(3): seed = (seed*a+b)%p c.append(seed>>80) print(f'a = {a}') print(f'b = {b}') print(f'p = {p}') print(f'c = {c}')
''' a = 2226195477738639469520314871241317996692000453980590059051655917244193431061796494084520115208972884910304639094257195331 b = 1819366699498013196825162828978957434212721200408011692822966187294576933971468888455937630017411789071339806414083368521 p = 2468226688875800583640242996971128907087199220172878918872664572373129611780447612341599434033067093631443731567292789387 c = [1458638764476576620497667312334744692692838533272664001794698423698634900864733383502067184618014, 1929877825753930927256723772056768775233426313865848693767475766366579127755530427079541769349812, 646691106155016146430045567492598040316128576565509395612683821702033873891600466055472183189754] ''' '''
from Crypto.Cipher import AES from Crypto.Util.number import *
a = 2226195477738639469520314871241317996692000453980590059051655917244193431061796494084520115208972884910304639094257195331 b = 1819366699498013196825162828978957434212721200408011692822966187294576933971468888455937630017411789071339806414083368521 m = 2468226688875800583640242996971128907087199220172878918872664572373129611780447612341599434033067093631443731567292789387 c = [1458638764476576620497667312334744692692838533272664001794698423698634900864733383502067184618014, 1929877825753930927256723772056768775233426313865848693767475766366579127755530427079541769349812, 646691106155016146430045567492598040316128576565509395612683821702033873891600466055472183189754]
h = [0] + c
length = len(h) for i inrange(length): h[i] <<= 80
A = [1] B = [0]
for i inrange(1, len(h)-1): A.append(a*A[i-1] % m) B.append((a*B[i-1]+a*h[i]+b-h[i+1]) % m)
A = A[1:] B = B[1:]
Ge = Matrix(ZZ,length,length)
for i inrange(len(A)): Ge[i,i] = m Ge[-2,i] = A[i] Ge[-1,i] = B[i]
K = 2**80 Ge[-2,-2] = 1 Ge[-1,-1] = K
for line in Ge.LLL(): ifabs(line[-1]) == K: L1 = line[-2] seed1 = h[1] + L1 seed = (seed1 - b) * inverse(a,m) % m print(f"seed = {seed}") print(long_to_bytes(seed))
大学×高中√
1 2 3 4 5 6 7 8
from Crypto.Util.number import * from enc import flag
m = bytes_to_long(flag) assertlen(flag)==47 leak = cos(m).n(1000) print(leak) # -0.531659424314510605474310465691627447018962841799592816094864089691364538229482189727389328879665722000498924085922309530705082058318143911592913356306771218326907498748543471792402846678395378914458319779159891679235865648174792237841148560400444502487744616191775450001945896249393139352114465002808
from Crypto.Util.number import * leak = -0.531659424314510605474310465691627447018962841799592816094864089691364538229482189727389328879665722000498924085922309530705082058318143911592913356306771218326907498748543471792402846678395378914458319779159891679235865648174792237841148560400444502487744616191775450001945896249393139352114465002808 A = arccos(leak)#sage自带的求反函数 phi = RealField(1000)#用realfield计算精度 pi =phi(pi) G = Matrix(QQ,[[1,0,2^750],[0,2^375,2^750*A],[0,0,2^750*2*pi]])#在实数域下计算 m = abs(G.LLL()[0][0]) print(long_to_bytes(int(m)))
import gmpy2 from Crypto.Util.number import * from enc import flag
m = bytes_to_long(flag) p = getPrime(512) q = getPrime(512) n = p*q e = getPrime(200) d = gmpy2.invert(e,(p-1)*(q-1)) dp = d % (p-1) c = pow(m,e,n)
print(f"n = {n}") print(f"c = {c}") print(f"e = {e}") print(f"dp = {dp}") ''' n = 80556471644505011891756231019311882225730165614863719395328309929825293641259274802719238521989722995475141775057817527464270040837552738905604676076146734989560693872114609281119098735209206723559622585697792579892238311917420010818437212211772833281743513007880423036718561435487430398906194020190782727533 c = 54148254421535490527493285183290511426930400302852195437953474915111379369271888877325441784156399780311852702053946823116096097645853719820288433712191436292215603420410887291711072280776432888651650824598073666456855448900533585686638180147222205725403586385675699949105000801347816441718934719453686534738 e = 1313707923168496810525667511687571667930728866593473823130269 dp = 5632614301315357701870642600570871749745208913790376158690650513220923850000171918022929749228070629033357006229715995644578804260941756683958425128792761 '''
e很大的dp泄露
欧拉降幂
ab (mod c) = ab (mod φ(c)) + φ(c) (mod c)
adpe − a ≡ 0 (mod p)
所以有(adpe − a)|p
1 2 3 4 5 6 7 8 9 10 11 12
from Crypto.Util.number import * from gmpy2 import * n = 80556471644505011891756231019311882225730165614863719395328309929825293641259274802719238521989722995475141775057817527464270040837552738905604676076146734989560693872114609281119098735209206723559622585697792579892238311917420010818437212211772833281743513007880423036718561435487430398906194020190782727533 c = 54148254421535490527493285183290511426930400302852195437953474915111379369271888877325441784156399780311852702053946823116096097645853719820288433712191436292215603420410887291711072280776432888651650824598073666456855448900533585686638180147222205725403586385675699949105000801347816441718934719453686534738 e = 1313707923168496810525667511687571667930728866593473823130269 dp = 5632614301315357701870642600570871749745208913790376158690650513220923850000171918022929749228070629033357006229715995644578804260941756683958425128792761 a = 2 p = GCD(pow(a, e*dp, n) - a, n) q = n // p d = inverse(e, (p - 1) * (q - 1)) m = pow(c, d, n) print(long_to_bytes(m))