2910 字
15 分钟
moectf2024_crypto
题目
现代密码学指北
task:
from Crypto.Util.number import bytes_to_long, getPrimefrom secret import flagp = getPrime(128)q = getPrime(128)n = p*qe = 65537m = bytes_to_long(flag)c = pow(m, e, n)print(f"n = {n}")print(f"p = {p}")print(f"q = {q}")print(f"c = {c}")'''n = 40600296529065757616876034307502386207424439675894291036278463517602256790833p = 197380555956482914197022424175976066223q = 205695522197318297682903544013139543071c = 36450632910287169149899281952743051320560762944710752155402435752196566406306'''
正常解密即可 exp
n = 40600296529065757616876034307502386207424439675894291036278463517602256790833p = 197380555956482914197022424175976066223q = 205695522197318297682903544013139543071c = 36450632910287169149899281952743051320560762944710752155402435752196566406306e=65537
from Crypto.Util.number import*
phi = (p-1)*(q-1)d = inverse(e,phi)m = pow(c,d,n)print(long_to_bytes(m))
baby_equation
task
from Crypto.Util.number import *from secret import flag
l = len(flag)m1, m2 = flag[:l//2], flag[l//2:]a = bytes_to_long(m1)b = bytes_to_long(m2)k = 0x2227e398fc6ffcf5159863a345df85ba50d6845f8c06747769fee78f598e7cb1bcf875fb9e5a69ddd39da950f21cb49581c3487c29b7c61da0f584c32ea21ce1edda7f09a6e4c3ae3b4c8c12002bb2dfd0951037d3773a216e209900e51c7d78a0066aa9a387b068acbd4fb3168e915f306ba40assert ((a**2 + 1)*(b**2 + 1) - 2*(a - b)*(a*b - 1)) == 4*(k + a*b)
思路 其实就是因式分解会得到,那么先开根号,再因式分解,再对因子进行排列组合就好
exp
from gmpy2 import *from Crypto.Util.number import *from math import *
k = 0x2227e398fc6ffcf5159863a345df85ba50d6845f8c06747769fee78f598e7cb1bcf875fb9e5a69ddd39da950f21cb49581c3487c29b7c61da0f584c32ea21ce1edda7f09a6e4c3ae3b4c8c12002bb2dfd0951037d3773a216e209900e51c7d78a0066aa9a387b068acbd4fb3168e915f306ba40
x = iroot(4*k,2)print(x)
# factor(x)factors = [2,2,2,2,3,3,31,61,223,4013,281317,4151351,5404604441993, 26798471753993,25866088332911027256931479223,64889106213996537255229963986303510188999911,370523737,339386329]
T = prod(factors)t = T ** 0.5n = len(factors)dp = {1: []}
for i in factors: for j in list(dp.keys()): cnt = j * i if cnt not in dp: dp[cnt] = dp[j] + [i]
min = min(dp.keys(), key=lambda x: abs(x - t))
factor1 = minfactor2 = T // min
print(factor1)print(factor2)
print(long_to_bytes(2948658764987911698882278955266869405625105496652193856947916257370492+1))print(long_to_bytes(2950365559902224963252311699604518749050102395042841254385700637274676-1))
big and small
task
from secret import flagfrom Crypto.Util.number import*m = long_to_bytes(flag)p = getPrime(1024)q = getPrime(1024)n = p*qe = 3c = pow(m,e,n)'''c = 150409620528288093947185249913242033500530715593845912018225648212915478065982806112747164334970339684262757e = 3n = 20279309983698966932589436610174513524888616098014944133902125993694471293062261713076591251054086174169670848598415548609375570643330808663804049384020949389856831520202461767497906977295453545771698220639545101966866003886108320987081153619862170206953817850993602202650467676163476075276351519648193219850062278314841385459627485588891326899019745457679891867632849975694274064320723175687748633644074614068978098629566677125696150343248924059801632081514235975357906763251498042129457546586971828204136347260818828746304688911632041538714834683709493303900837361850396599138626509382069186433843547745480160634787'''
思路 小明文攻击
exp
c = 150409620528288093947185249913242033500530715593845912018225648212915478065982806112747164334970339684262757e = 3n = 20279309983698966932589436610174513524888616098014944133902125993694471293062261713076591251054086174169670848598415548609375570643330808663804049384020949389856831520202461767497906977295453545771698220639545101966866003886108320987081153619862170206953817850993602202650467676163476075276351519648193219850062278314841385459627485588891326899019745457679891867632849975694274064320723175687748633644074614068978098629566677125696150343248924059801632081514235975357906763251498042129457546586971828204136347260818828746304688911632041538714834683709493303900837361850396599138626509382069186433843547745480160634787
from Crypto.Util.number import*from gmpy2 import*
flag=iroot(c,e)[0]print(long_to_bytes(flag))
ez_hash
task
from hashlib import sha256from secret import flag, secrets
assert flag == b'moectf{' + secrets + b'}'assert secrets[:4] == b'2100' and len(secrets) == 10hash_value = sha256(secrets).hexdigest()print(f"{hash_value = }")# hash_value = '3a5137149f705e4da1bf6742e62c018e3f7a1784ceebcb0030656a2b42f50b6a'
思路: 已知前四位,后六位未知,猜测都是数字,直接爆破
exp
import hashlib
target_hash = '3a5137149f705e4da1bf6742e62c018e3f7a1784ceebcb0030656a2b42f50b6a'
for i in range(100000000): secrets_candidate = f'2100{i:06}'.encode() # 生成 '2100XXXXXX' 格式的字节串 if hashlib.sha256(secrets_candidate).hexdigest() == target_hash: flag = b'moectf{' + secrets_candidate + b'}' print(flag) break
signin
task
from Crypto.Util.number import*from secret import flag
m = bytes_to_long(flag)p = getPrime(1024)q = getPrime(1024)n = p*qe = 65537c = pow(m,e,n)pq = (p-1)*(q-2)qp = (q-1)*(p-2)p_q = p + q
print(f"{c = }")print(f"{pq = }")print(f"{qp = }")print(f"{n = }")print(f"{p_q = }")'''c = 5654386228732582062836480859915557858019553457231956237167652323191768422394980061906028416785155458721240012614551996577092521454960121688179565370052222983096211611352630963027300416387011219744891121506834201808533675072141450111382372702075488292867077512403293072053681315714857246273046785264966933854754543533442866929316042885151966997466549713023923528666038905359773392516627983694351534177829247262148749867874156066768643169675380054673701641774814655290118723774060082161615682005335103074445205806731112430609256580951996554318845128022415956933291151825345962528562570998777860222407032989708801549746pq = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687154230787854196153067547938936776488741864214499155892870610823979739278296501074632962069426593691194105670021035337609896886690049677222778251559566664735419100459953672218523709852732976706321086266274840999100037702428847290063111455101343033924136386513077951516363739936487970952511422443500922412450462qp = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687077087914198877794354459669808240133383828356379423767736753506794441545506312066344576298453957064590180141648690226266236642320508613544047037110363523129966437840660693885863331837516125853621802358973786440314619135781324447765480391038912783714312479080029167695447650048419230865326299964671353746764860n = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687534959910892789661065614807265825078942931717855566686073463382398417205648946713373617006449901977718981043020664616841303517708207413215548110294271101267236070252015782044263961319221848136717220979435486850254298686692230935985442120369913666939804135884857831857184001072678312992442792825575636200505903p_q = 279533706577501791569740668595544511920056954944184570513187478007551195831693428589898548339751066551225424790534556602157835468618845221423643972870671556362200734472399328046960316064864571163851111207448753697980178391430044714097464866523838747053135392202848167518870720149808055682621080992998747265496'''
思路 解方程
exp
from sympy import symbols, Eq, solve
p, q = symbols('p q')
c = 5654386228732582062836480859915557858019553457231956237167652323191768422394980061906028416785155458721240012614551996577092521454960121688179565370052222983096211611352630963027300416387011219744891121506834201808533675072141450111382372702075488292867077512403293072053681315714857246273046785264966933854754543533442866929316042885151966997466549713023923528666038905359773392516627983694351534177829247262148749867874156066768643169675380054673701641774814655290118723774060082161615682005335103074445205806731112430609256580951996554318845128022415956933291151825345962528562570998777860222407032989708801549746pq = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687154230787854196153067547938936776488741864214499155892870610823979739278296501074632962069426593691194105670021035337609896886690049677222778251559566664735419100459953672218523709852732976706321086266274840999100037702428847290063111455101343033924136386513077951516363739936487970952511422443500922412450462qp = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687077087914198877794354459669808240133383828356379423767736753506794441545506312066344576298453957064590180141648690226266236642320508613544047037110363523129966437840660693885863331837516125853621802358973786440314619135781324447765480391038912783714312479080029167695447650048419230865326299964671353746764860n = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687534959910892789661065614807265825078942931717855566686073463382398417205648946713373617006449901977718981043020664616841303517708207413215548110294271101267236070252015782044263961319221848136717220979435486850254298686692230935985442120369913666939804135884857831857184001072678312992442792825575636200505903p_q = 279533706577501791569740668595544511920056954944184570513187478007551195831693428589898548339751066551225424790534556602157835468618845221423643972870671556362200734472399328046960316064864571163851111207448753697980178391430044714097464866523838747053135392202848167518870720149808055682621080992998747265496e=65537
eq1 = Eq(p * q, n)eq2 = Eq((p - 1) * (q - 2), pq)eq3 = Eq((q - 1) * (p - 2), qp)eq4 = Eq(p + q, p_q)
solution = solve((eq1, eq2, eq3, eq4), (p, q))
print(solution)
from Crypto.Util.number import*
p=101195416461091716428326199733504078281010548412226222689665080411126731520752210150756388683557219973649948209094722629248795549538890771346214761833764975454769057589710497693291150424006859232283601953197097456280805871953601208233200402046794268614613979577032173301390416040533984248749301081715040789947q=178338290116410075141414468862040433639046406531958347823522397596424464310941218439142159656193846577575476581439833972909039919079954450077429211036906580907431676882688830353669165640857711931567509254251656241699372519476443505864264464477044478438521412625815994217480304109274071433871779911283706475549
phi=(p-1)*(q-1)d = inverse(e,phi)m = pow(c,d,n)print(long_to_bytes(m))
大白兔
task
from Crypto.Util.number import *
flag = b'moectf{xxxxxxxxxx}'m = bytes_to_long(flag)
e1 = 12886657667389660800780796462970504910193928992888518978200029826975978624718627799215564700096007849924866627154987365059524315097631111242449314835868137e2 = 12110586673991788415780355139635579057920926864887110308343229256046868242179445444897790171351302575188607117081580121488253540215781625598048021161675697
def encrypt(m , e1 , e2): p = getPrime(512) q = getPrime(512) N = p*q c1 = pow((3*p + 7*q),e1,N) c2 = pow((2*p + 5*q),e2,N) e = 65537 c = pow(m , e , N) return c
print(encrypt(m ,e1 , e2))
'''N = 107840121617107284699019090755767399009554361670188656102287857367092313896799727185137951450003247965287300048132826912467422962758914809476564079425779097585271563973653308788065070590668934509937791637166407147571226702362485442679293305752947015356987589781998813882776841558543311396327103000285832158267c1 = 15278844009298149463236710060119404122281203585460351155794211733716186259289419248721909282013233358914974167205731639272302971369075321450669419689268407608888816060862821686659088366316321953682936422067632021137937376646898475874811704685412676289281874194427175778134400538795937306359483779509843470045c2 = 21094604591001258468822028459854756976693597859353651781642590543104398882448014423389799438692388258400734914492082531343013931478752601777032815369293749155925484130072691903725072096643826915317436719353858305966176758359761523170683475946913692317028587403027415142211886317152812178943344234591487108474c = 21770231043448943684137443679409353766384859347908158264676803189707943062309013723698099073818477179441395009450511276043831958306355425252049047563947202180509717848175083113955255931885159933086221453965914552773593606054520151827862155643433544585058451821992566091775233163599161774796561236063625305050'''
思路 很经典的题目
求出q之后p也就出来了
exp
from gmpy2 import*from Crypto.Util.number import *N = 107840121617107284699019090755767399009554361670188656102287857367092313896799727185137951450003247965287300048132826912467422962758914809476564079425779097585271563973653308788065070590668934509937791637166407147571226702362485442679293305752947015356987589781998813882776841558543311396327103000285832158267c1 = 15278844009298149463236710060119404122281203585460351155794211733716186259289419248721909282013233358914974167205731639272302971369075321450669419689268407608888816060862821686659088366316321953682936422067632021137937376646898475874811704685412676289281874194427175778134400538795937306359483779509843470045c2 = 21094604591001258468822028459854756976693597859353651781642590543104398882448014423389799438692388258400734914492082531343013931478752601777032815369293749155925484130072691903725072096643826915317436719353858305966176758359761523170683475946913692317028587403027415142211886317152812178943344234591487108474c = 21770231043448943684137443679409353766384859347908158264676803189707943062309013723698099073818477179441395009450511276043831958306355425252049047563947202180509717848175083113955255931885159933086221453965914552773593606054520151827862155643433544585058451821992566091775233163599161774796561236063625305050e1 = 12886657667389660800780796462970504910193928992888518978200029826975978624718627799215564700096007849924866627154987365059524315097631111242449314835868137e2 = 12110586673991788415780355139635579057920926864887110308343229256046868242179445444897790171351302575188607117081580121488253540215781625598048021161675697
f1 = pow(2, e1*e2, N) * pow(c1, e2, N)f2 = pow(3, e1*e2, N) * pow(c2, e1, N)q = abs(gcd(N, f1-f2))p = N//qprint(p)print(q)
phi= (p-1)*(q-1)e= 65537d= inverse(e, phi)m= pow(c, d, N)print(long_to_bytes(m))
More_secure_RSA
task
from Crypto.Util.number import *
flag = b'moectf{xxxxxxxxxxxxxxxxx}'
m = bytes_to_long(flag)p = getPrime(1024)q = getPrime(1024)n = p * qe = 0x10001c = pow(m, e, n)print(f'c = {c}')print(f'n = {n}')
'''Oh,it isn't secure enough!'''r = getPrime(1024)n = n * rc = pow(m, e, n)print(f'C = {c}')print(f'N = {n}')
'''c = 12992001402636687796268040906463852467529970619872166160007439409443075922491126428847990768804065656732371491774347799153093983118784555645908829567829548859716413703103209412482479508343241998746249393768508777622820076455330613128741381912099938105655018512573026861940845244466234378454245880629342180767100764598827416092526417994583641312226881576127632370028945947135323079587274787414572359073029332698851987672702157745794918609888672070493920551556186777642058518490585668611348975669471428437362746100320309846155934102756433753034162932191229328675448044938003423750406476228868496511462133634606503693079n = 16760451201391024696418913179234861888113832949815649025201341186309388740780898642590379902259593220641452627925947802309781199156988046583854929589247527084026680464342103254634748964055033978328252761138909542146887482496813497896976832003216423447393810177016885992747522928136591835072195940398326424124029565251687167288485208146954678847038593953469848332815562187712001459140478020493313651426887636649268670397448218362549694265319848881027371779537447178555467759075683890711378208297971106626715743420508210599451447691532788685271412002723151323393995544873109062325826624960729007816102008198301645376867C = 1227033973455439811038965425016278272592822512256148222404772464092642222302372689559402052996223110030680007093325025949747279355588869610656002059632685923872583886766517117583919384724629204452792737574445503481745695471566288752636639781636328540996436873887919128841538555313423836184797745537334236330889208413647074397092468650216303253820651869085588312638684722811238160039030594617522353067149762052873350299600889103069287265886917090425220904041840138118263873905802974197870859876987498993203027783705816687972808545961406313020500064095748870911561417904189058228917692021384088878397661756664374001122513267695267328164638124063984860445614300596622724681078873949436838102653185753255893379061574117715898417467680511056057317389854185497208849779847977169612242457941087161796645858881075586042016211743804958051233958262543770583176092221108309442538853893897999632683991081144231262128099816782478630830512N = 1582486998399823540384313363363200260039711250093373548450892400684356890467422451159815746483347199068277830442685312502502514973605405506156013209395631708510855837597653498237290013890476973370263029834010665311042146273467094659451409034794827522542915103958741659248650774670557720668659089460310790788084368196624348469099001192897822358856214600885522908210687134137858300443670196386746010492684253036113022895437366747816728740885167967611021884779088402351311559013670949736441410139393856449468509407623330301946032314939458008738468741010360957434872591481558393042769373898724673597908686260890901656655294366875485821714239821243979564573095617073080807533166477233759321906588148907331569823186970816432053078415316559827307902239918504432915818595223579467402557885923581022810437311450172587275470923899187494633883841322542969792396699601487817033616266657366148353065324836976610554682254923012474470450197'''
思路 用r作为模数进行求解
exp
from sympy import mod_inversefrom Crypto.Util.number import long_to_bytes
c = 12992001402636687796268040906463852467529970619872166160007439409443075922491126428847990768804065656732371491774347799153093983118784555645908829567829548859716413703103209412482479508343241998746249393768508777622820076455330613128741381912099938105655018512573026861940845244466234378454245880629342180767100764598827416092526417994583641312226881576127632370028945947135323079587274787414572359073029332698851987672702157745794918609888672070493920551556186777642058518490585668611348975669471428437362746100320309846155934102756433753034162932191229328675448044938003423750406476228868496511462133634606503693079N = 1582486998399823540384313363363200260039711250093373548450892400684356890467422451159815746483347199068277830442685312502502514973605405506156013209395631708510855837597653498237290013890476973370263029834010665311042146273467094659451409034794827522542915103958741659248650774670557720668659089460310790788084368196624348469099001192897822358856214600885522908210687134137858300443670196386746010492684253036113022895437366747816728740885167967611021884779088402351311559013670949736441410139393856449468509407623330301946032314939458008738468741010360957434872591481558393042769373898724673597908686260890901656655294366875485821714239821243979564573095617073080807533166477233759321906588148907331569823186970816432053078415316559827307902239918504432915818595223579467402557885923581022810437311450172587275470923899187494633883841322542969792396699601487817033616266657366148353065324836976610554682254923012474470450197e = 0x10001n = 16760451201391024696418913179234861888113832949815649025201341186309388740780898642590379902259593220641452627925947802309781199156988046583854929589247527084026680464342103254634748964055033978328252761138909542146887482496813497896976832003216423447393810177016885992747522928136591835072195940398326424124029565251687167288485208146954678847038593953469848332815562187712001459140478020493313651426887636649268670397448218362549694265319848881027371779537447178555467759075683890711378208297971106626715743420508210599451447691532788685271412002723151323393995544873109062325826624960729007816102008198301645376867C = 1227033973455439811038965425016278272592822512256148222404772464092642222302372689559402052996223110030680007093325025949747279355588869610656002059632685923872583886766517117583919384724629204452792737574445503481745695471566288752636639781636328540996436873887919128841538555313423836184797745537334236330889208413647074397092468650216303253820651869085588312638684722811238160039030594617522353067149762052873350299600889103069287265886917090425220904041840138118263873905802974197870859876987498993203027783705816687972808545961406313020500064095748870911561417904189058228917692021384088878397661756664374001122513267695267328164638124063984860445614300596622724681078873949436838102653185753255893379061574117715898417467680511056057317389854185497208849779847977169612242457941087161796645858881075586042016211743804958051233958262543770583176092221108309442538853893897999632683991081144231262128099816782478630830512
r=N//nphi=r-1d=mod_inverse(e,phi)m=pow(C,d,r)print(long_to_bytes(m))
ezlegendre
task
from sympy import *from Crypto.Util.number import *
p = getPrime(128)e = randprime(2, p)
FLAG = b'm'
def encrypt_flag(flag): ciphertext = [] plaintext = ''.join([bin(i)[2:].zfill(8) for i in flag]) print(plaintext) for bit in plaintext: n = pow(int(bit) + e, e , p) ciphertext.append(n) return ciphertext
print(f"p = {p}")print(encrypt_flag(FLAG))
思路 只有两个数字,把83185897643827119919760550833655486588当作0,171219394072263643527316538070481587611当作1,就是01字符串,然后转字符就好了,数据太大,就不写了
exp
conversion_dict = { 83185897643827119919760550833655486588: 0, 171219394072263643527316538070481587611: 1}
converted_c = [conversion_dict.get(x, x) for x in c]
converted_c_str = ''.join(map(str, converted_c))
print(converted_c_str)
s=b'01101101011011110110010101100011011101000110011001111011011011010110100101101110011101010111001101011111011011110110111001100101010111110011000101110011010111110110111000110000011101000101111101110001011101010011010001100100011100100011010001110100011010010110001101011111011100100011010001110011011010010110010001110101001101000101111101110111011010000110010101101110010111110111000001011111011011010110111101100100010111110110011000110000011101010111001001011111011001010111000101110101001101000011000101011111011101000110111101011111011101000110100001110010001100110011001101111101'
binary_string = b'01101101011011110110010101100011011101000110011001111011011011010110100101101110011101010111001101011111011011110110111001100101010111110011000101110011010111110110111000110000011101000101111101110001011101010011010001100100011100100011010001110100011010010110001101011111011100100011010001110011011010010110010001110101001101000101111101110111011010000110010101101110010111110111000001011111011011010110111101100100010111110110011000110000011101010111001001011111011001010111000101110101001101000011000101011111011101000110111101011111011101000110100001110010001100110011001101111101'
text = ''.join(chr(int(binary_string[i:i+8], 2)) for i in range(0, len(binary_string), 8))
print(text)
new_system
task
from random import randintfrom Crypto.Util.number import getPrime,bytes_to_long
flag = b'moectf{???????????????}'gift = bytes_to_long(flag)
def parametergenerate(): q = getPrime(256) gift1 = randint(1, q) gift2 = (gift - gift1) % q x = randint(1, q) assert gift == (gift1 + gift2) % q return q , x , gift1, gift2
def encrypt(m , q , x): a = randint(1, q) c = (a*x + m) % q return [a , c]
q , x , gift1 , gift2 = parametergenerate()print(encrypt(gift1 , q , x))print(encrypt(gift2 , q , x))print(encrypt(gift , q , x))print(f'q = {q}')
'''[48152794364522745851371693618734308982941622286593286738834529420565211572487, 21052760152946883017126800753094180159601684210961525956716021776156447417961][48649737427609115586886970515713274413023152700099032993736004585718157300141, 6060718815088072976566240336428486321776540407635735983986746493811330309844][30099883325957937700435284907440664781247503171217717818782838808179889651361, 85333708281128255260940125642017184300901184334842582132090488518099650581761]q = 105482865285555225519947662900872028851795846950902311343782163147659668129411'''
思路
带入求解就行了
exp
from Crypto.Util.number import inverse, long_to_bytes
a1, c1 = 48152794364522745851371693618734308982941622286593286738834529420565211572487, 21052760152946883017126800753094180159601684210961525956716021776156447417961a2, c2 = 48649737427609115586886970515713274413023152700099032993736004585718157300141, 6060718815088072976566240336428486321776540407635735983986746493811330309844a3, c3 = 30099883325957937700435284907440664781247503171217717818782838808179889651361, 85333708281128255260940125642017184300901184334842582132090488518099650581761q = 105482865285555225519947662900872028851795846950902311343782163147659668129411
x = ((c3 - c2 - c1) * inverse(a3 - a2 - a1, q)) % q
gift1 = (c1 - a1 * x) % qgift2 = (c2 - a2 * x) % qgift = (gift1 + gift2) % q
flag = long_to_bytes(gift)print(flag)
RSA_revenge
task
from Crypto.Util.number import getPrime, isPrime, bytes_to_longfrom secret import flag
def emirp(x): y = 0 while x !=0: y = y*2 + x%2 x = x//2 return y
while True: p = getPrime(512) q = emirp(p) if isPrime(q): break
n = p*qe = 65537m = bytes_to_long(flag)c = pow(m,e,n)print(f"{n = }")print(f"{c = }")
"""n = 141326884939079067429645084585831428717383389026212274986490638181168709713585245213459139281395768330637635670530286514361666351728405851224861268366256203851725349214834643460959210675733248662738509224865058748116797242931605149244469367508052164539306170883496415576116236739853057847265650027628600443901c = 47886145637416465474967586561554275347396273686722042112754589742652411190694422563845157055397690806283389102421131949492150512820301748529122456307491407924640312270962219946993529007414812671985960186335307490596107298906467618684990500775058344576523751336171093010950665199612378376864378029545530793597"""
思路 可以看看https://kt.gy/blog/2015/10/asis-2015-finals-rsasr/
exp
n = 141326884939079067429645084585831428717383389026212274986490638181168709713585245213459139281395768330637635670530286514361666351728405851224861268366256203851725349214834643460959210675733248662738509224865058748116797242931605149244469367508052164539306170883496415576116236739853057847265650027628600443901def t(a, b, k): if k == 256: if a*b == n: print(a, b) return for i in range(2): for j in range(2): a1 = a + i*(2**k) + j*(2**(511-k)) b1 = b + j*(2**k) + i*(2**(511-k)) if a1*b1 > n: continue if (a1+(2**(511-k)))*(b1+(2**(511-k))) < n: continue if ((a1*b1)%(2**(k+1))) != (n%(2**(k+1))): continue t(a1, b1, k+1)
for i in range(2): t(i*(2**256), i*(2**256), 0)
p=12119998731259483292178496920109290754181396164390285597126378297678818779092115139911720576157973310671490865211601201831597946479039132512609504866583931q=11660635291534613230423193509391946961264539191735481147071890944740311229658362673314192872117237108949853531941630122241060679012089130178372253390640871c=47886145637416465474967586561554275347396273686722042112754589742652411190694422563845157055397690806283389102421131949492150512820301748529122456307491407924640312270962219946993529007414812671985960186335307490596107298906467618684990500775058344576523751336171093010950665199612378376864378029545530793597from Crypto.Util.number import *n=p*qphi=(p-1)*(q-1)d=inverse(65537,phi)m=pow(c,d,n)print(long_to_bytes(m))
One more bit
task
from Crypto.Util.number import getStrongPrime, bytes_to_long, GCD, inversefrom Crypto.Util.Padding import padfrom secret import flagimport random
def genKey(nbits,dbits): p = getStrongPrime(nbits//2) q = getStrongPrime(nbits//2) n = p*q phi = (p-1)*(q-1) while True: d = random.getrandbits(dbits) if d.bit_length() == dbits: if GCD(d, phi) == 1: e = inverse(d, phi) pk = (n, e) sk = (p, q, d) return pk, sk
nbits = 1024dbits = 258message = pad(flag,16)msg = pad(message, 16)m = bytes_to_long(msg)pk= genKey(nbits, dbits)[0]n, e = pkciphertext = pow(m, e, n)
with open("data.txt","w") as f: f.write(f"pk = {pk}\n") f.write(f"ciphertext = {ciphertext}\n") f.close()
思路 Boneh_Durfee攻击的板子题
exp 省略
EzPack
task
from Crypto.Util.number import *from secret import flagimport random
p = 2050446265000552948792079248541986570794560388346670845037360320379574792744856498763181701382659864976718683844252858211123523214530581897113968018397826268834076569364339813627884756499465068203125112750486486807221544715872861263738186430034771887175398652172387692870928081940083735448965507812844169983643977assert len(flag) == 42
def encode(msg): return bin(bytes_to_long(msg))[2:].zfill(8*len(msg))
def genkey(len): sums = 0 keys = [] for i in range(len): k = random.randint(1,7777) x = sums + k keys.append(x) sums += x return keys
key = genkey(42*8)
def enc(m, keys): msg = encode(m) print(len(keys)) print(len(msg)) assert len(msg) == len(keys) s = sum((k if (int(p,2) == 1) else 1) for p, k in zip(msg, keys)) print(msg) for p0,k in zip(msg,keys): print(int(p0,2)) return pow(7,s,p)
cipher = enc(flag,key)
with open("output.txt", "w") as fs: fs.write(str(key)+'\n') fs.write(str(cipher))
思路 p-1是光滑的,直接DLP,然后背包,数据太大了,不写了
exp
from Crypto.Util.number import*from sympy import discrete_log#pow(7,s,p)s=363965742933281351259442199216117822475210003294088371760914916341815880641228470807683148775152284520244
decoded_bits = []for k in reversed(key): if s >= k: decoded_bits.append('1') s -= k else: decoded_bits.append('0')
decoded_bits = ''.join(reversed(decoded_bits))
flag = long_to_bytes(int(decoded_bits, 2))print(flag)
EzMatrix
task
from Crypto.Util.number import *from secret import FLAG,secrets,SECERT_T
assert len(secrets) == 16assert FLAG == b'moectf{' + secrets + b'}'assert len(SECERT_T) <= 127
class LFSR: def __init__(self): self._s = list(map(int,list("{:0128b}".format(bytes_to_long(secrets))))) for _ in range(8*len(secrets)): self.clock()
def clock(self): b = self._s[0] c = 0 for t in SECERT_T:c ^= self._s[t] self._s = self._s[1:] + [c] return b
def stream(self, length): return [self.clock() for _ in range(length)]
c = LFSR()stream = c.stream(256)print("".join(map(str,stream))[:-5])# 11111110011011010000110110100011110110110101111000101011001010110011110011000011110001101011001100000011011101110000111001100111011100010111001100111101010011000110110101011101100001010101011011101000110001111110100000011110010011010010100100000000110
思路 lfsr每次生成一位都会形成一个方程
根据条件,一共有123组方程,然后反解出mask
exp
from Crypto.Util.number import *from gmpy2 import*
def xor(a,b): res=0 for i,j in zip(a,b): if j==1: res^=int(i) return res
def rev(stream,mask): temp = [0] + stream[:-1] if xor(temp, mask) == stream[-1]: return temp
temp = [1] + stream[:-1] if xor(temp, mask) == stream[-1]: return temp return None
lfsr_stream='11111110011011010000110110100011110110110101111000101011001010110011110011000011110001101011001100000011011101110000111001100111011100010111001100111101010011000110110101011101100001010101011011101000110001111110100000011110010011010010100100000000110'
M=matrix(Zmod(2),0,128)
for i in range(len(lfsr_stream)-128): v=vector([int(x) for x in lfsr_stream[i:i+128]]) M=M.stack(v)
res=vector(Zmod(2), [int(x) for x in lfsr_stream[128:]])
mask = M.solve_right(res)for k in range(5): stream = [int(x) for x in lfsr_stream[:128]] for idx in range(16 * 8): tmp = rev(stream, list(mask))
if tmp is None: break stream = tmp flag=int(''.join([str(x) for x in stream]), 2) print(long_to_bytes(flag)) mask += M.right_kernel().basis()[k]
hidden_poly
task
from Crypto.Util.Padding import padfrom Crypto.Util.number import *from Crypto.Cipher import AESimport os
q = 264273181570520944116363476632762225021key = os.urandom(16)iv = os.urandom(16)root = 122536272320154909907460423807891938232f = sum([a*root**i for i,a in enumerate(key)])assert key.isascii()assert f % q == 0
with open('flag.txt','rb') as f: flag = f.read()
cipher = AES.new(key,AES.MODE_CBC, iv)ciphertext = cipher.encrypt(pad(flag,16)).hex()
with open('output.txt','w') as f: f.write(f"{iv = }" + "\n") f.write(f"{ciphertext = }" + "\n")
思路
其中都是0到128,很小,那么就可以写成
直接LLL就行了
exp
iv = b'Gc\xf2\xfd\x94\xdc\xc8\xbb\xf4\x84\xb1\xfd\x96\xcd6\\'ciphertext ='d23eac665cdb57a8ae7764bb4497eb2f79729537e596600ded7a068c407e67ea75e6d76eb9e23e21634b84a96424130e'q = 264273181570520944116363476632762225021root = 122536272320154909907460423807891938232
from Crypto.Util.number import *from Crypto.Cipher import AES
L = Matrix(ZZ, 16, 16)for i in range(16 - 1): L[i, i] = 1 L[i, 15] = root ** (i + 1)
L[-1, -1] = qL = L.LLL()
for res in L: tmp = [] for idx in res: tmp.append(int(abs(idx))) tmp = [tmp[-1]] + tmp[:-1] if all(0 < x < 128 for x in tmp): key = bytearray([x for x in tmp]) cipher = AES.new(key,AES.MODE_CBC, iv) flag = cipher.decrypt(long_to_bytes(int(ciphertext, 16))) print(flag)
babe-Lifting
from Crypto.Util.number import *from secret import flag
p = getPrime(512)q = getPrime(512)n = p*qe = 0x1001d = inverse(e, (p-1)*(q-1))bit_leak = 400d_leak = d & ((1<<bit_leak)-1)msg = bytes_to_long(flag)cipher = pow(msg,e,n)pk = (n, e)
with open('output.txt','w') as f: f.write(f"pk = {pk}\n") f.write(f"cipher = {cipher}\n") f.write(f"hint = {d_leak}\n") f.close()
n,e = (53282434320648520638797489235916411774754088938038649364676595382708882567582074768467750091758871986943425295325684397148357683679972957390367050797096129400800737430005406586421368399203345142990796139798355888856700153024507788780229752591276439736039630358687617540130010809829171308760432760545372777123, 4097)cipher = 14615370570055065930014711673507863471799103656443111041437374352195976523098242549568514149286911564703856030770733394303895224311305717058669800588144055600432004216871763513804811217695900972286301248213735105234803253084265599843829792871483051020532819945635641611821829176170902766901550045863639612054hint = 1550452349150409256147460237724995145109078733341405037037945312861833198753379389784394833566301246926188176937280242129
思路 d的低位泄露板子
exp
from Crypto.Util.number import long_to_bytes,inversen,e = (53282434320648520638797489235916411774754088938038649364676595382708882567582074768467750091758871986943425295325684397148357683679972957390367050797096129400800737430005406586421368399203345142990796139798355888856700153024507788780229752591276439736039630358687617540130010809829171308760432760545372777123, 4097)c = 14615370570055065930014711673507863471799103656443111041437374352195976523098242549568514149286911564703856030770733394303895224311305717058669800588144055600432004216871763513804811217695900972286301248213735105234803253084265599843829792871483051020532819945635641611821829176170902766901550045863639612054dlow = 1550452349150409256147460237724995145109078733341405037037945312861833198753379389784394833566301246926188176937280242129
def get_full_p(p_low,n,pbits): kbits = p_low.bit_length() R.<x> = PolynomialRing(Zmod(n)) f = x * 2^kbits + p_low f = f.monic() res = f.small_roots(X = 2^(pbits-kbits),beta=0.4) if res != []: p = int(res[0]) * 2^kbits + p_low return p
for k in range(e): var('p') f1 = e*dlow*p - (k*n*p - k*p^2 - k*n + (k+1)*p) roots = solve_mod(f1,2^400) if roots != []: for root in roots: if int(root[0]).bit_length() == 400: p = get_full_p(int(root[0]),n,512) if p: q = n // p d = inverse(e,(p-1)*(q-1)) m = pow(c,d,n) print(long_to_bytes(m)) break
ezLCG
task
from sage.all import *from random import getrandbits, randintfrom secrets import randbelowfrom Crypto.Util.number import getPrime,isPrime,inversefrom Crypto.Util.Padding import padfrom Crypto.Cipher import AESfrom secret import priKey, flagfrom hashlib import sha1import os
q = getPrime(160)while True: t0 = q*getrandbits(864) if isPrime(t0+1): p = t0 + 1 break
x = priKeyassert p % q == 1h = randint(1,p-1)g = pow(h,(p-1)//q,p)y = pow(g,x,p)
def sign(z, k): r = pow(g,k,p) % q s = (inverse(k,q)*(z+r*priKey)) % q return (r,s)
def verify(m,s,r): z = int.from_bytes(sha1(m).digest(), 'big') u1 = (inverse(s,q)*z) % q u2 = (inverse(s,q)*r) % q r0 = ((pow(g,u1,p)*pow(y,u2,p)) % p) % q return r0 == r
def lcg(a, b, q, x): while True: x = (a * x + b) % q yield x
msg = [os.urandom(16) for i in range(5)]
a, b, x = [randbelow(q) for _ in range(3)]prng = lcg(a, b, q, x)sigs = []for m, k in zip(msg,prng): z = int.from_bytes(sha1(m).digest(), "big") % q r, s = sign(z, k) assert verify(m, s, r) sigs.append((r,s))
print(f"{g = }")print(f"{h = }")print(f"{q = }")print(f"{p = }")print(f"{msg = }")print(f"{sigs = }")key = sha1(str(priKey).encode()).digest()[:16]iv = os.urandom(16)cipher = AES.new(key, AES.MODE_CBC,iv)ct = cipher.encrypt(pad(flag,16))print(f"{iv = }")print(f"{ct = }")
'''g = 81569684196645348869992756399797937971436996812346070571468655785762437078898141875334855024163673443340626854915520114728947696423441493858938345078236621180324085934092037313264170158390556505922997447268262289413542862021771393535087410035145796654466502374252061871227164352744675750669230756678480403551h = 13360659280755238232904342818943446234394025788199830559222919690197648501739683227053179022521444870802363019867146013415532648906174842607370958566866152133141600828695657346665923432059572078189013989803088047702130843109809724983853650634669946823993666248096402349533564966478014376877154404963309438891q = 1303803697251710037027345981217373884089065173721p = 135386571420682237420633670579115261427110680959831458510661651985522155814624783887385220768310381778722922186771694358185961218902544998325115481951071052630790578356532158887162956411742570802131927372034113509208643043526086803989709252621829703679985669846412125110620244866047891680775125948940542426381msg = [b'I\xf0\xccy\xd5~\xed\xf8A\xe4\xdf\x91+\xd4_$', b'~\xa0\x9bCB\xef\xc3SY4W\xf9Aa\rO', b'\xe6\x96\xf4\xac\n9\xa7\xc4\xef\x82S\xe9 XpJ', b'3,\xbb\xe2-\xcc\xa1o\xe6\x93+\xe8\xea=\x17\xd1', b'\x8c\x19PHN\xa8\xbc\xfc\xa20r\xe5\x0bMwJ']sigs = [(913082810060387697659458045074628688804323008021, 601727298768376770098471394299356176250915124698), (406607720394287512952923256499351875907319590223, 946312910102100744958283218486828279657252761118), (1053968308548067185640057861411672512429603583019, 1284314986796793233060997182105901455285337520635), (878633001726272206179866067197006713383715110096, 1117986485818472813081237963762660460310066865326), (144589405182012718667990046652227725217611617110, 1028458755419859011294952635587376476938670485840)]iv = b'M\xdf\x0e\x7f\xeaj\x17PE\x97\x8e\xee\xaf:\xa0\xc7'ct = b"\xa8a\xff\xf1[(\x7f\xf9\x93\xeb0J\xc43\x99\xb25:\xf5>\x1c?\xbd\x8a\xcd)i)\xdd\x87l1\xf5L\xc5\xc5'N\x18\x8d\xa5\x9e\x84\xfe\x80\x9dm\xcc"'''from sage.all import *from random import getrandbits, randintfrom secrets import randbelowfrom Crypto.Util.number import getPrime,isPrime,inversefrom Crypto.Util.Padding import padfrom Crypto.Cipher import AESfrom secret import priKey, flagfrom hashlib import sha1import os
q = getPrime(160)while True: t0 = q*getrandbits(864) if isPrime(t0+1): p = t0 + 1 break
x = priKeyassert p % q == 1h = randint(1,p-1)g = pow(h,(p-1)//q,p)y = pow(g,x,p)
def sign(z, k): r = pow(g,k,p) % q s = (inverse(k,q)*(z+r*priKey)) % q return (r,s)
def verify(m,s,r): z = int.from_bytes(sha1(m).digest(), 'big') u1 = (inverse(s,q)*z) % q u2 = (inverse(s,q)*r) % q r0 = ((pow(g,u1,p)*pow(y,u2,p)) % p) % q return r0 == r
def lcg(a, b, q, x): while True: x = (a * x + b) % q yield x
msg = [os.urandom(16) for i in range(5)]
a, b, x = [randbelow(q) for _ in range(3)]prng = lcg(a, b, q, x)sigs = []for m, k in zip(msg,prng): z = int.from_bytes(sha1(m).digest(), "big") % q r, s = sign(z, k) assert verify(m, s, r) sigs.append((r,s))
print(f"{g = }")print(f"{h = }")print(f"{q = }")print(f"{p = }")print(f"{msg = }")print(f"{sigs = }")key = sha1(str(priKey).encode()).digest()[:16]iv = os.urandom(16)cipher = AES.new(key, AES.MODE_CBC,iv)ct = cipher.encrypt(pad(flag,16))print(f"{iv = }")print(f"{ct = }")
'''g = 81569684196645348869992756399797937971436996812346070571468655785762437078898141875334855024163673443340626854915520114728947696423441493858938345078236621180324085934092037313264170158390556505922997447268262289413542862021771393535087410035145796654466502374252061871227164352744675750669230756678480403551h = 13360659280755238232904342818943446234394025788199830559222919690197648501739683227053179022521444870802363019867146013415532648906174842607370958566866152133141600828695657346665923432059572078189013989803088047702130843109809724983853650634669946823993666248096402349533564966478014376877154404963309438891q = 1303803697251710037027345981217373884089065173721p = 135386571420682237420633670579115261427110680959831458510661651985522155814624783887385220768310381778722922186771694358185961218902544998325115481951071052630790578356532158887162956411742570802131927372034113509208643043526086803989709252621829703679985669846412125110620244866047891680775125948940542426381msg = [b'I\xf0\xccy\xd5~\xed\xf8A\xe4\xdf\x91+\xd4_$', b'~\xa0\x9bCB\xef\xc3SY4W\xf9Aa\rO', b'\xe6\x96\xf4\xac\n9\xa7\xc4\xef\x82S\xe9 XpJ', b'3,\xbb\xe2-\xcc\xa1o\xe6\x93+\xe8\xea=\x17\xd1', b'\x8c\x19PHN\xa8\xbc\xfc\xa20r\xe5\x0bMwJ']sigs = [(913082810060387697659458045074628688804323008021, 601727298768376770098471394299356176250915124698), (406607720394287512952923256499351875907319590223, 946312910102100744958283218486828279657252761118), (1053968308548067185640057861411672512429603583019, 1284314986796793233060997182105901455285337520635), (878633001726272206179866067197006713383715110096, 1117986485818472813081237963762660460310066865326), (144589405182012718667990046652227725217611617110, 1028458755419859011294952635587376476938670485840)]iv = b'M\xdf\x0e\x7f\xeaj\x17PE\x97\x8e\xee\xaf:\xa0\xc7'ct = b"\xa8a\xff\xf1[(\x7f\xf9\x93\xeb0J\xc43\x99\xb25:\xf5>\x1c?\xbd\x8a\xcd)i)\xdd\x87l1\xf5L\xc5\xc5'N\x18\x8d\xa5\x9e\x84\xfe\x80\x9dm\xcc"'''
思路 可以发现我们有9组多项式方程,且度都不高。用groebner,即可解出未知元
exp
from Crypto.Util.number import *from Crypto.Cipher import AESfrom hashlib import sha1g = 81569684196645348869992756399797937971436996812346070571468655785762437078898141875334855024163673443340626854915520114728947696423441493858938345078236621180324085934092037313264170158390556505922997447268262289413542862021771393535087410035145796654466502374252061871227164352744675750669230756678480403551h = 13360659280755238232904342818943446234394025788199830559222919690197648501739683227053179022521444870802363019867146013415532648906174842607370958566866152133141600828695657346665923432059572078189013989803088047702130843109809724983853650634669946823993666248096402349533564966478014376877154404963309438891q = 1303803697251710037027345981217373884089065173721p = 135386571420682237420633670579115261427110680959831458510661651985522155814624783887385220768310381778722922186771694358185961218902544998325115481951071052630790578356532158887162956411742570802131927372034113509208643043526086803989709252621829703679985669846412125110620244866047891680775125948940542426381msg = [b'I\xf0\xccy\xd5~\xed\xf8A\xe4\xdf\x91+\xd4_$', b'~\xa0\x9bCB\xef\xc3SY4W\xf9Aa\rO', b'\xe6\x96\xf4\xac\n9\xa7\xc4\xef\x82S\xe9 XpJ', b'3,\xbb\xe2-\xcc\xa1o\xe6\x93+\xe8\xea=\x17\xd1', b'\x8c\x19PHN\xa8\xbc\xfc\xa20r\xe5\x0bMwJ']sigs = [(913082810060387697659458045074628688804323008021, 601727298768376770098471394299356176250915124698), (406607720394287512952923256499351875907319590223, 946312910102100744958283218486828279657252761118), (1053968308548067185640057861411672512429603583019, 1284314986796793233060997182105901455285337520635), (878633001726272206179866067197006713383715110096, 1117986485818472813081237963762660460310066865326), (144589405182012718667990046652227725217611617110, 1028458755419859011294952635587376476938670485840)]iv = b'M\xdf\x0e\x7f\xeaj\x17PE\x97\x8e\xee\xaf:\xa0\xc7'ct = b"\xa8a\xff\xf1[(\x7f\xf9\x93\xeb0J\xc43\x99\xb25:\xf5>\x1c?\xbd\x8a\xcd)i)\xdd\x87l1\xf5L\xc5\xc5'N\x18\x8d\xa5\x9e\x84\xfe\x80\x9dm\xcc"
msg = [bytes_to_long(sha1(x).digest()) for x in msg]r = []s = []
for i, j in sigs: r.append(i) s.append(j)
PR.<k1,k2,k3,k4,k5,a,b,x> = PolynomialRing(Zmod(q))f1 = a * k1 + b - k2f2 = a * k2 + b - k3f3 = a * k3 + b - k4f4 = a * k4 + b - k5f5 = msg[0] + r[0] * x - s[0] * k1f6 = msg[1] + r[1] * x - s[1] * k2f7 = msg[2] + r[2] * x - s[2] * k3f8 = msg[3] + r[3] * x - s[3] * k4f9 = msg[4] + r[4] * x - s[4] * k5
Fs = [f1, f2, f3, f4, f5, f6, f7, f8, f9]I = Ideal(Fs)B = I.groebner_basis()
print(B)prikey = -1144162652064701115049643134487732928553039124427
priKey = prikey % qkey = sha1(str(priKey).encode()).digest()[:16]
cipher = AES.new(key, AES.MODE_CBC,iv)flag = cipher.decrypt(ct)print(flag)
moectf2024_crypto
https://www.zhuangsanmeng.xyz/posts/moectf2024_crypto/