去年菜的很没做出来几题,记录一下复现时做的一些题目
XOR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from Crypto.Util.number import *from pwn import xorkey = b'...' flag = b'...' assert len (key)==4 enc = bytes_to_long(xor(flag,key)) f1 = 4585958212176920650644941909171976689111990 f2 = 3062959364761961602614252587049328627114908 e1 = enc^f1 e2 = e1^f2 print (e2)""" 10706859949950921239354880312196039515724907 """
先^回来
1 2 3 4 5 6 7 8 9 from Crypto.Util.number import *f1 = 4585958212176920650644941909171976689111990 f2 = 3062959364761961602614252587049328627114908 e2 = 10706859949950921239354880312196039515724907 e1 = f2^e2 enc = e1^f1 print (long_to_bytes(enc))
根据
将密文开头以及给出的一直flag头’SYC{’ XOR一下得到key
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from Crypto.Util.number import *f1 = 4585958212176920650644941909171976689111990 f2 = 3062959364761961602614252587049328627114908 e2 = 10706859949950921239354880312196039515724907 e1 = f2^e2 enc = e1^f1 print (long_to_bytes(enc))from pwn import xora=b'mes)' b=b'SYC{' print (xor(a, b))c=xor(a, b) m= b'mes)_c@3LHobXchblA' print (xor(m, c))
ncoCRT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from Crypto.Util.number import *import randomflag = b'SYC{...}' m = bytes_to_long(flag+b'\x01' *23 ) p = [0 ]*5 c = [0 ]*5 for i in range (5 ): p0 = random.randint(2 **100 ,2 **101 ) p[i] = p0 c = [m%p[i] for i in range (5 )] print (f"p = {p} " )print (f"c = {c} " )""" p = [1921232050179818686537976490035, 2050175089402111328155892746480, 1960810970476421389691930930824, 1797713136323968089432024221276, 2326915607951286191807212748022] c = [1259284928311091851012441581576, 1501691203352712190922548476321, 1660842626322200346728249202857, 657314037433265072289232145909, 2056630082529583499248887436721] """
有五个式子形如 c n ≡ m (mod p n )
用sage自带的crt函数即可解决
1 2 3 4 5 6 p = [1921232050179818686537976490035 , 2050175089402111328155892746480 , 1960810970476421389691930930824 , 1797713136323968089432024221276 , 2326915607951286191807212748022 ] c = [1259284928311091851012441581576 , 1501691203352712190922548476321 , 1660842626322200346728249202857 , 657314037433265072289232145909 , 2056630082529583499248887436721 ] m = crt(c,p) from Crypto.Util.number import long_to_bytesprint (long_to_bytes(m))
inPEM
公钥解析,得到
1 2 n=19909823107653171578063591352961144331355821517081529017694276790993397379180193511755806958091550033235815834847549265751244192211761569881061742997804509098095297146520946343734939782935970054031389390447526577982809412074573616889663964050032806967234869741452169276495048891650957729859124875343810181695665153129824527065062831773013713479602052423965588148263292672514853749647510938621421264137177666497737099263481269491867593812579958283619882699866915561357437484323854411934718569074869408000191465973545262527827064708529700071967884924505367105288433603597633451764659888020272057850625902629529400734213 e=65537
读取私钥,错误,说明被改了,010打开手撕
1 2 3 4 5 6 7 8 9 10 11 12 wZyyAzKowuDD1R48UelUskEv0W8AXLOHR4nni 2uqP/7tlAPCJrMVD8zoRsRviyUnqO6y7cV7G0Fo1AoGBALpb6vOC9Ya/BEYV8+yL 814K0KQc7LITkwqGrDWoDZAxmgWqVtoxHuhDWr5jF+ttFZBPx4fTezTEjarXXSt3 pB1c7EwnzO0Hy9qJH++g2dcCUCO8uGXBbAACZqCQZAAydSrM5zozWAYMBWcj54j0 LtyOEg4PWPXiTzJ//xxWaH+xAoGBAKFGRIyYD89JvlZA6oz7YnjzsnDlTq01td32 XAuw62dZQHWmg1npC3YtzFlgTyNY2QelObmryyc2vFnxVhTYcDXFLQwrX8X5YV4A rFAAlyzxpNzYPzDHrdqLD6PhMU+wRuHVPyAtNBsL0N+mgQcsWJJvngSTHg86kJOl HlNuLBGhAoGAFiG3VR+lubcPvXOVAvkt+c8rF6qcmXlb2Og0hNwDJ2roX98aqOVy p5AWGPoA1siI4/RPIp1ClfEwKMjraun1ZJs/jKemaQk2hdhWkQ+6QinvUJbA1Lqm TcRmKa1emY/U6I8ce6N69e7ver1DV4I/ugSahJlZT/JRyF5qj1uVZ/k= -----END RSA PRIVATE KEY-----
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from base64 import b64decodeimport binasciis = '''2uqP/7tlAPCJrMVD8zoRsRviyUnqO6y7cV7G0Fo1AoGBALpb6vOC9Ya/BEYV8+yL 814K0KQc7LITkwqGrDWoDZAxmgWqVtoxHuhDWr5jF+ttFZBPx4fTezTEjarXXSt3 pB1c7EwnzO0Hy9qJH++g2dcCUCO8uGXBbAACZqCQZAAydSrM5zozWAYMBWcj54j0 LtyOEg4PWPXiTzJ//xxWaH+xAoGBAKFGRIyYD89JvlZA6oz7YnjzsnDlTq01td32 XAuw62dZQHWmg1npC3YtzFlgTyNY2QelObmryyc2vFnxVhTYcDXFLQwrX8X5YV4A rFAAlyzxpNzYPzDHrdqLD6PhMU+wRuHVPyAtNBsL0N+mgQcsWJJvngSTHg86kJOl HlNuLBGhAoGAFiG3VR+lubcPvXOVAvkt+c8rF6qcmXlb2Og0hNwDJ2roX98aqOVy p5AWGPoA1siI4/RPIp1ClfEwKMjraun1ZJs/jKemaQk2hdhWkQ+6QinvUJbA1Lqm TcRmKa1emY/U6I8ce6N69e7ver1DV4I/ugSahJlZT/JRyF5qj1uVZ/k=''' s = b64decode(s) print (binascii.hexlify(s))
分析输出
1 2 3 4 5 6 7 8 9 10 11 12 13 daea8fffbb6500f089acc543f33a11b11be2c949ea3bacbb715ec6d05a35#不知道是啥 028181#e 00ba5beaf382f586bf044615f3ec8bf35e0ad0a41cecb213930a86ac35a80d90319a05aa56da311ee8435abe6317eb6d15904fc787d37b34c48daad75d2b77a41d5cec4c27cced07cbda891fefa0d9d7025023bcb865c16c000266a090640032752acce73a3358060c056723e788f42edc8e120e0f58f5e24f327fff1c56687fb1#dp 028181#e 00a146448c980fcf49be5640ea8cfb6278f3b270e54ead35b5ddf65c0bb0eb67594075a68359e90b762dcc59604f2358d907a539b9abcb2736bc59f15614d87035c52d0c2b5fc5f9615e00ac5000972cf1a4dcd83f30c7adda8b0fa3e1314fb046e1d53f202d341b0bd0dfa681072c58926f9e04931e0f3a9093a51e536e2c11a1#貌似是dq 028180#e 1621b7551fa5b9b70fbd739502f92df9cf2b17aa9c99795bd8e83484dc03276ae85fdf1aa8e572a7901618fa00d6c888e3f44f229d4295f13028c8eb6ae9f5649b3f8ca7a669093685d856910fba4229ef5096c0d4baa64dc46629ad5e998fd4e88f1c7ba37af5eeef7abd4357823fba049a8499594ff251c85e6a8f5b9567f9#也不知道是啥
然后就是dp泄露解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 n = 19909823107653171578063591352961144331355821517081529017694276790993397379180193511755806958091550033235815834847549265751244192211761569881061742997804509098095297146520946343734939782935970054031389390447526577982809412074573616889663964050032806967234869741452169276495048891650957729859124875343810181695665153129824527065062831773013713479602052423965588148263292672514853749647510938621421264137177666497737099263481269491867593812579958283619882699866915561357437484323854411934718569074869408000191465973545262527827064708529700071967884924505367105288433603597633451764659888020272057850625902629529400734213 e = 65537 c = 0x3ebcefe91cb56a985a514dacefe4e048c1e805a6a3a1afcdc405812044dce1ce247b1de001b77dcb83ff3f38b392dab34f0d2aabdcb2afe670f104b2dfa04c2ff88b563804993f5ce2babd8a81dbde7f99ffacbfb6a77723a84e6c7d758a4d89667b6e0f9308c9c154b8f8fdafa224fc9364ba2995ab5a4a8a608b43bffa1ae9007ffb224aa45485f861eed1cdfaa34efefdcb03cb12501a7f9ffd2336d86b12339c3ec8ea9f321d6d6a3df566f3325205c7ec84dffc107eabb5b06fcededa419914c61987c0ae11d502fe91846efd548bc1dc9fab733f838fe27e5f0a5452f1cd79e6d3b125f060aef698c30484aa386d6aa44e12871cb2b20ef3bebad1a90c dp = 0x00ba5beaf382f586bf044615f3ec8bf35e0ad0a41cecb213930a86ac35a80d90319a05aa56da311ee8435abe6317eb6d15904fc787d37b34c48daad75d2b77a41d5cec4c27cced07cbda891fefa0d9d7025023bcb865c16c000266a090640032752acce73a3358060c056723e788f42edc8e120e0f58f5e24f327fff1c56687fb1 from Crypto.Util.number import *from tqdm import trangefor i in trange(1 ,e+1 ): if (e*dp%i==1 ): p=(e*dp-1 )//i+1 if (n%p!=0 ): continue q=n//p phi=(p-1 )*(q-1 ) d=inverse(e,phi) m=pow (c,d,n) print (long_to_bytes(m))
然后用这个密码去解密Ginshen.exe中的txt得到flag
一个比较方便的过滤验证
1 2 3 4 5 6 7 8 9 from base64 import *import binasciis = '''''' s = b64decode(s) s = binascii.hexlify(s).decode() l = s.split('0281' ) leak = [] for i in l[1 :]: print ('0281' , i[:2 ], i[2 :])
ecc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 from Crypto.Util.number import getPrimefrom secret import flagp = getPrime(256 ) a = getPrime(256 ) b = getPrime(256 ) E = EllipticCurve(GF(p),[a,b]) m = E.random_point() G = E.random_point() k = getPrime(256 ) K = k * G r = getPrime(256 ) c1 = m + r * K c2 = r * G cipher_left = bytes_to_long(flag[:len (flag)//2 ]) * m[0 ] cipher_right = bytes_to_long(flag[len (flag)//2 :]) * m[1 ] print (f"p = {p} " )print (f"a = {a} " )print (f"b = {b} " )print (f"k = {k} " )print (f"E = {E} " )print (f"c1 = {c1} " )print (f"c2 = {c2} " )print (f"cipher_left = {cipher_left} " )print (f"cipher_right = {cipher_right} " )''' p = 93202687891394085633786409619308940289806301885603002539703165565954917915237 a = 93822086754590882682502837744000915992590989006575416134628106376590825652793 b = 80546187587527518012258369984400999843218609481640396827119274116524742672463 k = 58946963503925758614502522844777257459612909354227999110879446485128547020161 E = Elliptic Curve defined by y^2 = x^3 + 619398863196797048716428124691975702784687120972413594924940810635907737556*x + 80546187587527518012258369984400999843218609481640396827119274116524742672463 over Finite Field of size 93202687891394085633786409619308940289806301885603002539703165565954917915237 c1 = (40485287784577105052142632380297282223290388901294496494726004092953216846111 : 81688798450940847410572480357702533480504451191937977779652402489509511335169 : 1) c2 = (51588540344302003527882762117190244240363885481651104291377049503085003152858 : 77333747801859674540077067783932976850711668089918703995609977466893496793359 : 1) cipher_left = 34210996654599605871773958201517275601830496965429751344560373676881990711573 cipher_right = 62166121351090454316858010748966403510891793374784456622783974987056684617905 '''
ecc椭圆曲线加密
M = C 1 − k C 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from Crypto.Util.number import long_to_bytesp = 93202687891394085633786409619308940289806301885603002539703165565954917915237 a = 93822086754590882682502837744000915992590989006575416134628106376590825652793 b = 80546187587527518012258369984400999843218609481640396827119274116524742672463 k = 58946963503925758614502522844777257459612909354227999110879446485128547020161 F= GF(p) E = EllipticCurve(F, [a,b]) c1 = E(40485287784577105052142632380297282223290388901294496494726004092953216846111 , 81688798450940847410572480357702533480504451191937977779652402489509511335169 ) c2 = E(51588540344302003527882762117190244240363885481651104291377049503085003152858 , 77333747801859674540077067783932976850711668089918703995609977466893496793359 ) left = 34210996654599605871773958201517275601830496965429751344560373676881990711573 right = 62166121351090454316858010748966403510891793374784456622783974987056684617905 m = c1 - k * c2 m_1, m_2 = m.xy() m1 = F(left) / m_1 m2 = F(right) / m_2 print (long_to_bytes(int (m1))+long_to_bytes(int (m2)))
ezrsa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from Crypto.Util.number import *from secret import flagm = bytes_to_long(flag) assert m.bit_length()<500 p = getPrime(512 ) q = getPrime(512 ) n = p*q e = 3 c = pow (m, e, n) bits = 150 m = (m >> bits) << bits h = (2024 *m-2023 ) % n print ('n =' ,n)print ('c =' ,c)print ('h =' ,h)''' n = 98776098002891477120992675696155328927086322526307976337988006606436135336004472363084175941067711391936982491358233723506086793155908108571814951698009309071244571404116817767749308434991695075517682979438837852005396491907180020541510210086588426719828012276157990720969176680296088209573781988504138607511 c = 9379399412697943604731810117788765980709097637865795846842608472521416662350816995261599566999896411508374352899659705171307916591351157861393506101348972544843696221631571188094524310759046142743046919075577350821523746192424192386688583922197969461446371843309934880019670502610876840610213491163201385965 h = 111518648179416351438603824560360041496706848494616308866057817087295675324528913254309319829895222661760009533326673551072163865
测一下数据就知道h远小于n,所以模N下直接计算即可
然后就是高位m泄露,打一元copper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 n = 98776098002891477120992675696155328927086322526307976337988006606436135336004472363084175941067711391936982491358233723506086793155908108571814951698009309071244571404116817767749308434991695075517682979438837852005396491907180020541510210086588426719828012276157990720969176680296088209573781988504138607511 c = 9379399412697943604731810117788765980709097637865795846842608472521416662350816995261599566999896411508374352899659705171307916591351157861393506101348972544843696221631571188094524310759046142743046919075577350821523746192424192386688583922197969461446371843309934880019670502610876840610213491163201385965 h = 111518648179416351438603824560360041496706848494616308866057817087295675324528913254309319829895222661760009533326673551072163865 e = 3 from Crypto.Util.number import *m1 = ((h+2023 )//2024 )%n PR.<x> = PolynomialRing(Zmod(n)) f = (m1 + x)**e - c f=f.monic() res = f.small_roots(X=2 **150 , beta=0.4 ,epsilon=0.1 ) if res != []: m = m1 + res[0 ] print (long_to_bytes(int (m)))
LLL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from Crypto.Util.number import *flag = b'******' m = bytes_to_long(flag) assert m.bit_length() == 327 p = getPrime(1024 ) a = getPrime(1024 ) c = getPrime(400 ) b = (a*m + c) % p print (f'a = {a} ' )print (f'b = {b} ' )print (f'p = {p} ' )''' a = 169790849804323540946197204708402762862586197604183102589270741859708550301920348112941305999764092197996929298474590062625556806793613268527763774013772685954699561684244945434843656515307801882995934869499880288594142919381501796488815033294127591623260894764750214588993456840404443515671353802614450411717 b = 87985708831523238980948938165414984318379459926002798504435964538203443877988599888615810231215118828138306895572062833107988965151522391460216837691927960249874511818878134399363147008042562222910234739940697553852540265617603482995091203105040187460485673579382171260197291783748886765929376179151804062085 p = 131724494512065658801039766546788821718063963144467818735768040631367069153816254855229655449559099188694403260044990366292026916085340250077198735215774149087025577263769846650728593180101073940507285459917860726551385227481715873503612683249433020201729190862430476054822102865441136763977415824331858801617 '''
解决看我的格密码入门刷题
RnoCRT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import hashlibfrom Crypto.Util.number import *from secret import xm = [getRandomNBitInteger(256 ) for i in range (10 )] u = hashlib.sha256(x).hexdigest() assert u[:5 ]==b'6a651' flag = b'SYC{' +u+b'}' c = [x % i for i in m] print (m)print (c)
crt+哈希爆破验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import hashlibfrom Crypto.Util.number import *m=[207867980504656835313307696396607264603 , 245036212212570610987366430554968489325 , 270836744824069537438646110613439698666 , 319275775495422875474878625752594133023 , 254268823435329877199449670714528712873 , 213093607196415232366564484229844568444 , 246921085368773491003187313772615702950 ] c=[150031581047390726903711035932621949276 , 21260202376534810598778595491323328519 , 144049733622518360270048059408969512643 , 236920143187836025924037873968303507493 , 99781504248790469459151935530031893836 , 69236016568483424294966410179787943383 , 20613188366058016717435734248097940419 ] x=crt(c,m) l=1 for i in range (7 ): l=lcm(l,m[i]) for k in range (10000 ): y=x+k*l h1=hashlib.sha256(str (y).encode()).hexdigest() h2=hashlib.sha256(long_to_bytes(y)).hexdigest() if h1[:5 ]=='6a651' : print (f'SYC{{{h1} }}' ) if h2[:5 ]=='6a651' : print (f'SYC{{{h2} }}' )
Number theory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 from Crypto.Util.number import *m = bytes_to_long(flag) q = getPrime(1024 ) p = getPrime(1024 ) q1 = getPrime(1024 ) p1 = getPrime(1024 ) n = p * q n1 = p1 * q h0 = pow (1012 * q + 2024 , p1, n1) print (f"h0 = {h0} " )print (f"n1 = {n1} " )n2 = p * q1 h1 = getPrime(128 )*p+getPrime(13 )*q1 h2 = getPrime(128 )*p+getPrime(13 )*q1 print (f"h1 = {h1} " )print (f"h2 = {h2} " )print (f'n2 = {n2} ' )e = 65537 c = pow (m, e, n) print (f'c = {c} ' )''' h0 = 3220497006402049508998763812708472832647814868290156746347730942871191356255789659370553564805270033069126673720344310199953651087754072020225702916105541813428786992668144172000495857408180695235017329451164552864440669887978780387408892281885728829108705426036377534262123812335152528611168777211280571694805002313718755871797426493929314877273385162106226582910473718696585558235361302211164190022765345477880209355073870857330694309139033191510002831755011163554405501084092882774630793037506647051531578470767441695642108269033577519614546722167605348209455599860877630930453549375215766657975702946679735793440 n1 = 20609629372145649869124883931477035418773265506807982287973634398860995335157854064383658546598627777214414513344620919765235474447787454254677033199140440513722365295528339478763686234572386246701669139829187532179573583918405628738545887852577214800663095592976049188005405242091639210252676232732956312108538849591909382864675439965387851084691144379692503823575367370407191667133473482821484955537306602611587604747693171586870973700406072872451067709522642066831289686968535823774273770385924779368338446367102184983154486987531633971065357864924738084803301054789863293592286600424063888458243900130876991944561 h1 = 49194502383195208917988199785355579000471120627698824524136563939112767971337049691779758664899497703009458337602635607307068610164325874221815125058246159504553260658300727486252329656228567456351563661171511248498573151135374757953887871426130912974127123668357951196795364055703535399924661649957282476915345782505912688106575686848420343362888 h2 = 56029812337811022982598747354987989915364610368395101948222609237230875599013444593473706280586983516630982411154519894488542135837471701015074142753084529513202513061481615522865380857058628008542724882609524855349464549317203533208567803034618377155637303135785566874122555481931560957334493233423618193735362609235034574175221191665401074291634 n2 = 21127172569887870569621986802814771398069606826661397979515556618791602174698226712111670185315617811180192688381471253591193212149192104216153890060029438171543010427356810059660168369171504065120474047401466632600230981702536898738744701541132759858595341068713321976579864810553447534204513491008705215041861247277449063318972113826820821732327255577559447446606667162763843696891825420560307688553022453470653875157114663943723258181186659915926780802902213978395961981750159147594076399769386787561910947372748908551775527715538708855235861297549189165238857651886658156332640360898769204102407630920314871304057 c = 5607552428806279725164332098717496105359323731793797865776852054987286366396268835656116948807084338497364746716217052175055013330847114498067023163878490040957130515880922531725226729467904687450269817551037876044274898360914422201634758724176912018795267171627398316542607462818553194467631468793807762529509728325759331142060865432879561622747895422022839077034959965640817419843376693946391886148327389538923557583964708218796910422008150480950732394548385083016293891237783400286493750498647816940000092965104858068292374074379723230507283787259827582725133425982004517180631242028412315096023451549819804660838 '''
分为两个部分
part1 这里我们有 h 0 ≡ (1012q + 2024)p 1 (mod n 1 )
同时模q h 0 ≡ (2024)p 1 (mod q )
费马小定理 a p ≡ a (mod p )
∴ (2024)p 1 ≡ (2024)n (mod q )
∴ h 0 ≡ (2024)n (mod q )
∴ h 0 − (2024)n = k * q
part2
1 2 h1 = getPrime(128 )*p+getPrime(13 )*q1 h2 = getPrime(128 )*p+getPrime(13 )*q1
满足线性关系,并且13位数不大,爆破即可
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 h0 = 3220497006402049508998763812708472832647814868290156746347730942871191356255789659370553564805270033069126673720344310199953651087754072020225702916105541813428786992668144172000495857408180695235017329451164552864440669887978780387408892281885728829108705426036377534262123812335152528611168777211280571694805002313718755871797426493929314877273385162106226582910473718696585558235361302211164190022765345477880209355073870857330694309139033191510002831755011163554405501084092882774630793037506647051531578470767441695642108269033577519614546722167605348209455599860877630930453549375215766657975702946679735793440 n1 = 20609629372145649869124883931477035418773265506807982287973634398860995335157854064383658546598627777214414513344620919765235474447787454254677033199140440513722365295528339478763686234572386246701669139829187532179573583918405628738545887852577214800663095592976049188005405242091639210252676232732956312108538849591909382864675439965387851084691144379692503823575367370407191667133473482821484955537306602611587604747693171586870973700406072872451067709522642066831289686968535823774273770385924779368338446367102184983154486987531633971065357864924738084803301054789863293592286600424063888458243900130876991944561 c = 5607552428806279725164332098717496105359323731793797865776852054987286366396268835656116948807084338497364746716217052175055013330847114498067023163878490040957130515880922531725226729467904687450269817551037876044274898360914422201634758724176912018795267171627398316542607462818553194467631468793807762529509728325759331142060865432879561622747895422022839077034959965640817419843376693946391886148327389538923557583964708218796910422008150480950732394548385083016293891237783400286493750498647816940000092965104858068292374074379723230507283787259827582725133425982004517180631242028412315096023451549819804660838 from Crypto.Util.number import *q=GCD(h0-pow (2024 ,n1,n1),n1) print ('q:' , q)h1 = 49194502383195208917988199785355579000471120627698824524136563939112767971337049691779758664899497703009458337602635607307068610164325874221815125058246159504553260658300727486252329656228567456351563661171511248498573151135374757953887871426130912974127123668357951196795364055703535399924661649957282476915345782505912688106575686848420343362888 h2 = 56029812337811022982598747354987989915364610368395101948222609237230875599013444593473706280586983516630982411154519894488542135837471701015074142753084529513202513061481615522865380857058628008542724882609524855349464549317203533208567803034618377155637303135785566874122555481931560957334493233423618193735362609235034574175221191665401074291634 n2 = 21127172569887870569621986802814771398069606826661397979515556618791602174698226712111670185315617811180192688381471253591193212149192104216153890060029438171543010427356810059660168369171504065120474047401466632600230981702536898738744701541132759858595341068713321976579864810553447534204513491008705215041861247277449063318972113826820821732327255577559447446606667162763843696891825420560307688553022453470653875157114663943723258181186659915926780802902213978395961981750159147594076399769386787561910947372748908551775527715538708855235861297549189165238857651886658156332640360898769204102407630920314871304057 list = []for i in range (2 **12 , 2 **13 ): if isPrime(i): list .append(i) for x1 in list : for x2 in list : p1=(x1*h1 - x2*h2) p =GCD(p1, n2) if p != 1 and p != n2: print ('p:' , p) print ('x1:' , x1) print ('x2:' , x2) break q=118874695786116734917065043442458952547874656505388902849583986739750433740760352688054822604427183355141871756128562592954061494068247418404217180198818025424511398092449124305805738302689459754842048957858402877387959339315483803736974651246922275580029822892751678239186974759117933061631242872453942209471 p = 178557871889789476735392773689039729944728430625818764599203953284194468360955366524476361619864195810267037397001299832526726480560276846147351034417947012223276604383027178163281207815083989579760615671067777036793963045167137767877397560786425871554804100602428308050015870442290953340882348809647523234561 n = p * q phi = (p - 1 ) * (q - 1 ) e = 65537 d = inverse(e, phi) m = pow (c, d, n) print ('m:' , long_to_bytes(m))
highlow
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from Crypto.Util.number import *e = 65537 p = getPrime(1024 ) q = getPrime(1024 ) n = p * q pxor = p ^ (bytes_to_long(flag)<<400 ) assert len (flag)== 44 m = bytes_to_long(flag) c = pow (m, e, n) print ('c =' ,c)print ('n =' ,n)print ('pxor =' ,pxor)''' c = 11017336122691034053241992293963114590816319844384287448629663672049205892828600396465505710922907685545939978376321927394655458727494361852952898280905220963163625482295222856129164172619564344634365520328815972232825639292605311741655988427166811406091329613627961070231457035303298793651546412496975662225857123805867756651901374507447803198638466304862480202099076813471571495380132563252630789218173007275890600746758285415274434393381125742526014986039652677605642226576741424053749512280825231217420239089105794080707322357602941046822659335487420672699022969372037662958497832065752272061853723653365171768556 n = 14091206320622523674847720139761543154822190879035380245424481267482550932229611965964424965958386255076593911062804299275581742665134207390532802109700225140999812698020838683697375891035625255222001884477214361835101442288725383073334392995186053867261497679234362794914108033574681292656522807928680812726462195077833184018122369579002715900477290345396065912536529290811962117814900448319776590712946259540382461632468634827959957286905806432005632864663985014872365672653476822833921870071851313424903481282350342304819149894610089804321405589433980650340610521659031234826823369114800150883988613877877881069579 pxor = 124229245244085791439650934438639686782423445183921252684721764061493908790073948877623812930339081158169421854801552819088679937157357924845248082716160727839419054107753000815066526032809275137495740454967765165248115412626716101315676902716808647904092798908601183908297141420793614426863816161203796966951 '''
flag长度44,大概351位,并且此处我们有
1 pxor = p ^ (bytes_to_long(flag)<<400 )
说明flag异或的低400位均为0,所以依旧保持原样,实际上只有中间的351位异或,并且高位也未被异或,所以我们只需要还原出p的低位和高位然后打一个一元copper即可
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from Crypto.Util.number import *pxor = 124229245244085791439650934438639686782423445183921252684721764061493908790073948877623812930339081158169421854801552819088679937157357924845248082716160727839419054107753000815066526032809275137495740454967765165248115412626716101315676902716808647904092798908601183908297141420793614426863816161203796966951 c = 11017336122691034053241992293963114590816319844384287448629663672049205892828600396465505710922907685545939978376321927394655458727494361852952898280905220963163625482295222856129164172619564344634365520328815972232825639292605311741655988427166811406091329613627961070231457035303298793651546412496975662225857123805867756651901374507447803198638466304862480202099076813471571495380132563252630789218173007275890600746758285415274434393381125742526014986039652677605642226576741424053749512280825231217420239089105794080707322357602941046822659335487420672699022969372037662958497832065752272061853723653365171768556 n = 14091206320622523674847720139761543154822190879035380245424481267482550932229611965964424965958386255076593911062804299275581742665134207390532802109700225140999812698020838683697375891035625255222001884477214361835101442288725383073334392995186053867261497679234362794914108033574681292656522807928680812726462195077833184018122369579002715900477290345396065912536529290811962117814900448319776590712946259540382461632468634827959957286905806432005632864663985014872365672653476822833921870071851313424903481282350342304819149894610089804321405589433980650340610521659031234826823369114800150883988613877877881069579 e=65537 p_high=pxor>>751 <<751 p_low=pxor-(pxor>>400 <<400 ) p_middle=p_high+p_low PR.<x> = PolynomialRing(Zmod(n)) f = x*2 **400 + p_middle f=f.monic() res= f.small_roots(X=2 ^351 ,beta = 0.4 ,epsilon=0.1 ) if res != []: p1 = res[0 ] p = int (p1*2 **400 + p_middle) q=n//p phi=(p-1 )*(q-1 ) d=inverse(e,phi) print (long_to_bytes(int (pow (c,d,n))))
easy_LLL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 from Crypto.Util.number import *m = bytes_to_long(flag) p = getPrime(1024 ) assert m.bit_length() == 255 def encrypt (m ): a = getPrime(1024 ) b = getPrime(400 ) c = (a * m + b) % p return c, a result = [encrypt(m) for i in range (5 )] c = [x[0 ] for x in result] a = [x[1 ] for x in result] print ('p =' , p)print ('c =' , c)print ('a =' , a)''' p = 114770017142688382362918268558878024848633097928402093647914503696492833723966801545716194546592346338592062332306371502256979159033965343002132956304625610134374822329402499359634555710129039614275145668904822690744696925414716152630310915301980153974374009140517084226870950134327432658087834138202887501571 c = [25269157674120082500323585451842928560404625967932662908517922704871828513397233858615005968124017428639853960550468542894270451871612496631645175015826203493265945456529848647562285359912541672751550625137876486033809099678631009005979648033707322772087110235116987698692692467320479776960630479772236446980, 75827517416784647262997004080634347924631190865715212882627791181841845414253117114184423517850773219376565782814219713490136873921446382123059696483594598328510450811390866671002685611755205236016843942407419858592870716928648777362367108239158432436307113173823883182666320180058177554647020175991566479974, 4000439731719746534404360339840675006453847582492745979982221624660296805996044239209286181541462187650487112017410839740281883027081539802479046385802021188067656190594734619927933032154534742175380783895559841318520045144113562164247717915766667365412215754183668349398802684299015216478025166881475794536, 16711257143606850336586355581909703391105580636095435863487225535083010317005439435375105800641024112138121810242207127443011036209544967633123983636015153089843815287370646565071784002098183021489882046492609441708361550786752857773565252821037805549119284258373739189052221307754872723967188683410620808193, 106512227999048988543537542345636528925594107128125030635002665980574709006558840446189017357623681828677935125012144689963798865971782914704616798239451971370511961281779438306334353650663495164449411037055054859128957955413918744183200858441122917851347996800797164614883188302584586112732819164555910532500] a = [177876163920838720585474640511391249051418827853372387342635245341495792468826199544624082182728094652999191797576747605771062756630817438777653951772485569478516324903956113309190795622258346824643390004835397272889256696087356239515881459115499360779486974615331766141255410923960657795391638070660994726539, 154147211832384364492785997490497428696214843927503185938896425556028644075902949520267734189423717477702286854849502563505554965833703544305651488482204719931055591825164774932532116940955079750398001376723036214113076925445019856194390932639722726924707396244454184674407094860919513514591518499956074524561, 162236910312416448303316079284626131452444352290110477620135842885125003493068172330766174225997049094080836685617836911475638508283918576304502582848847097467251286819613975600023439985149604495163647781268904127545271241114039490048103188362740808427663167350820948490766499995036870926879430699822216419877, 156324330649465856865205652642919116551480610060830456323361514761783406613162826555066367215822747145109223530381689780625035795004458919262362420375225560790467893332585836287433463308447660726674632677063603419250881619682710122472587150879771212601074942044613408069114640355658551759306352327418458216623, 94727349364308455432706991721504607810501329870619614073375570944298709074650444442139356318854809081925625009516102978518170343525726627149123655332253529418292440747073463615106501530133930750010290051226765906194210372904323460884238665194406125116885468971886527174150462509520345910607640580833401931201] '''
一样的解决,只是数据变多了,写两个列表或者说自己提两个数据即可
1 2 3 4 5 6 7 8 9 10 11 12 13 from Crypto.Util.number import *p = 114770017142688382362918268558878024848633097928402093647914503696492833723966801545716194546592346338592062332306371502256979159033965343002132956304625610134374822329402499359634555710129039614275145668904822690744696925414716152630310915301980153974374009140517084226870950134327432658087834138202887501571 c = [25269157674120082500323585451842928560404625967932662908517922704871828513397233858615005968124017428639853960550468542894270451871612496631645175015826203493265945456529848647562285359912541672751550625137876486033809099678631009005979648033707322772087110235116987698692692467320479776960630479772236446980 , 75827517416784647262997004080634347924631190865715212882627791181841845414253117114184423517850773219376565782814219713490136873921446382123059696483594598328510450811390866671002685611755205236016843942407419858592870716928648777362367108239158432436307113173823883182666320180058177554647020175991566479974 , 4000439731719746534404360339840675006453847582492745979982221624660296805996044239209286181541462187650487112017410839740281883027081539802479046385802021188067656190594734619927933032154534742175380783895559841318520045144113562164247717915766667365412215754183668349398802684299015216478025166881475794536 , 16711257143606850336586355581909703391105580636095435863487225535083010317005439435375105800641024112138121810242207127443011036209544967633123983636015153089843815287370646565071784002098183021489882046492609441708361550786752857773565252821037805549119284258373739189052221307754872723967188683410620808193 , 106512227999048988543537542345636528925594107128125030635002665980574709006558840446189017357623681828677935125012144689963798865971782914704616798239451971370511961281779438306334353650663495164449411037055054859128957955413918744183200858441122917851347996800797164614883188302584586112732819164555910532500 ] a = [177876163920838720585474640511391249051418827853372387342635245341495792468826199544624082182728094652999191797576747605771062756630817438777653951772485569478516324903956113309190795622258346824643390004835397272889256696087356239515881459115499360779486974615331766141255410923960657795391638070660994726539 , 154147211832384364492785997490497428696214843927503185938896425556028644075902949520267734189423717477702286854849502563505554965833703544305651488482204719931055591825164774932532116940955079750398001376723036214113076925445019856194390932639722726924707396244454184674407094860919513514591518499956074524561 , 162236910312416448303316079284626131452444352290110477620135842885125003493068172330766174225997049094080836685617836911475638508283918576304502582848847097467251286819613975600023439985149604495163647781268904127545271241114039490048103188362740808427663167350820948490766499995036870926879430699822216419877 , 156324330649465856865205652642919116551480610060830456323361514761783406613162826555066367215822747145109223530381689780625035795004458919262362420375225560790467893332585836287433463308447660726674632677063603419250881619682710122472587150879771212601074942044613408069114640355658551759306352327418458216623 , 94727349364308455432706991721504607810501329870619614073375570944298709074650444442139356318854809081925625009516102978518170343525726627149123655332253529418292440747073463615106501530133930750010290051226765906194210372904323460884238665194406125116885468971886527174150462509520345910607640580833401931201 ] for i in range (5 ): b = c[i] A = a[i] G = matrix([[1 ,0 ,A],[0 ,2 ^180 ,b],[0 ,0 ,p]]) print (G.LLL()) L = G.LLL()[0 ][0 ] m = abs (L) print (long_to_bytes(int (m)))