记录下近期在NSSCTF Crypto的刷题记录 ....
密码学新手菜鸡简单记录。数学基础不是很好 还在慢慢补......
[SWPUCTF 2021
新生赛]crypto1 共模攻击
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from gmpy2 import *from Crypto.Util.number import *flag = '****************************' flag = {"asfajgfbiagbwe" } p = getPrime(2048 ) q = getPrime(2048 ) m1 = bytes_to_long(bytes (flag.encode())) e1e2 = 3087 n = p*q print ()flag1 = pow (m1,e1,n) flag2 = pow (m1,e2,n) print ('flag1= ' +str (flag1))print ('flag2= ' +str (flag2))print ('n= ' +str (n))
题目分析:
1.e1*e2=3087 尝试分解e1 e2
2.flag1 flag2【c1 c2】 公用同一个模进行加密【共模攻击】
利用前提: RSA在生成密钥过程中使用相同的模数 n
已知 n c1 c2 e1 e2 求m 【在不知d1 d2情况下得到m】
WP:
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 import gmpy2from Crypto.Util.number import long_to_bytesc1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594 c2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408 n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437 e1e2 = 3087 fac = [3 ,7 ,3 *3 ,3 *7 ,3 *7 *7 ,3 *7 *7 *7 ,7 *7 ,3 *3 *7 ,3 *3 *7 *7 ,3 *3 *7 *7 *7 ] for e1 in fac: if e1e2 % e1 == 0 : e2 = e1e2 // e1 s0,s1,s2 = gmpy2.gcdext(e1,e2) m_s0 = pow (c1, s1, n) * pow (c2, s2, n) % n m = long_to_bytes(gmpy2.iroot(m_s0,s0)[0 ]) print (m)
[SWPUCTF 2021
新生赛]crypto2 共模攻击
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 from gmpy2 import *from Crypto.Util.number import *flag = '***************' p = getPrime(512 ) q = getPrime(512 ) m1 = bytes_to_long(bytes (flag.encode())) n = p*q e1 = getPrime(32 ) e2 = getPrime(32 ) print ()flag1 = pow (m1,e1,n) flag2 = pow (m1,e2,n) print ('flag1= ' +str (flag1))print ('flag2= ' +str (flag2))print ('e1= ' +str (e1))print ('e2= ' +str (e2))print ('n= ' +str (n))
WP:
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 import gmpy2from Crypto.Util.number import *def rsa_gong_N_def (e1,e2,c1,c2,n ): e1, e2, c1, c2, n=int (e1),int (e2),int (c1),int (c2),int (n) s = gmpy2.gcdext(e1, e2) s1 = s[1 ] s2 = s[2 ] if s1 < 0 : s1 = - s1 c1 = gmpy2.invert(c1, n) elif s2 < 0 : s2 = - s2 c2 = gmpy2.invert(c2, n) m = (pow (c1,s1,n) * pow (c2 ,s2 ,n)) % n return int (m) c1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280 c2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075 e1= 3247473589 e2= 3698409173 n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313 m = rsa_gong_N_def(e1,e2,c1,c2,n) print (long_to_bytes(m))
[SWPUCTF 2021 新生赛]crypto3
[-]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from gmpy2 import *from Crypto.Util.number import *flag = '******************' p = getPrime(512 ) q = getPrime(512 ) m1 = bytes_to_long(bytes (flag.encode())) n = p*q flag1 = pow (m1,p,n) flag2 = pow (m1,q,n) print ('flag1= ' +str (flag1))print ('flag2= ' +str (flag2))print ('n= ' +str (n))
共模n 已知c1 c2 但是e1 e2未知
[SWPUCTF 2021
新生赛]crypto4 素数分解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from gmpy2 import *from Crypto.Util.number import *flag = '**********' p = getPrime(512 ) q = next_prime(p) m1 = bytes_to_long(bytes (flag.encode())) e = 0x10001 n = p*q flag1 = pow (m1,e,n) print ('flag= ' +str (flag1))print ('n= ' +str (n))flag= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243 n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import gmpy2from Crypto.Util.number import *e = 0x10001 c= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243 n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153 p = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956044421 q = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956045093 phi_n = (p-1 )*(q-1 ) d = gmpy2.invert(e,phi_n) m = pow (c,d,n) print (long_to_bytes(m))
[SWPUCTF 2021
新生赛]crypto5 低指数e攻击
1 2 3 4 flag= 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333 n= 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419
下载附件后 只得到了 n c
没有其他条件 就只能先考虑低指数e去试了 e 1~3
e=3 可直接得到flag 套代码即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import gmpy2from Crypto.Util.number import *import libnumc = 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333 n = 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419 e = 3 k = 0 while 1 : res = gmpy2.iroot(c+k*n,e) if (res[1 ] == True ): print (libnum.n2s(int (res[0 ]))) break k = k+1
[SWPUCTF 2021 新生赛]crypto6
base
1 2 3 4 5 6 var="************************************" flag='NSSCTF{' + base64.b16encode(base64.b32encode(base64.b64encode(var.encode()))) + '}' print (flag)小明不小心泄露了源码,输出结果为:4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D,你能还原出var的正确结果吗?
已知密文 分别进行了 b16 b32 b64加密
对应 b64 b32 b16解密即可
1 2 3 4 5 6 7 8 9 import base64from base64 import *c = '4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D' print (b'NSSCTF{' +base64.b64decode(base64.b32decode(base64.b16decode(c))) +b'}' )
[SWPUCTF 2021 新生赛]crypto7
md5
题目:
69f7906323b4f7d1e4e972acf4abfbfc ,得到的结果用NSSCTF{}包裹。
md5直接解密即可
[SWPUCTF 2021
新生赛]crypto8 UUencode
题目:
73E-30U1&>V-H965S95]I<U]P;W=E<GT`
http://www.hiencode.com/uu.html UUencode解码
UUencode【Unix-to-Unix encoding】编码特征:
编码时将 3个字符
顺序放入一个24位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为4个部分,高位在先,每个部分6位,用下面的64个字符重新表示
3个字符 24bit
6bit为一组分成4组,每组以十进制表示出现的字节数值,数值在0~63之间,然后加上32
得到ascii对应字符
64个字符【对应ascii码32(空格) - 95(_)】
1 !”#$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_
[SWPUCTF 2021 新生赛]crypto9
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984} 脚本给你了,去解吧 letter_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' def Get_KeyList (key ): key_list = [] for ch in key: key_list.append(ord (ch.upper()) - 65 ) return key_list def Encrypt (plaintext, key_list ): ciphertext = "" i = 0 for ch in plaintext: if 0 == i % len (key_list): i = 0 if ch.isalpha(): if ch.isupper(): ciphertext += letter_list[(ord (ch) - 65 + key_list[i]) % 26 ] i += 1 else : ciphertext += letter_list[(ord (ch) - 97 + key_list[i]) % 26 ].lower() i += 1 else : ciphertext += ch return ciphertext def Decrypt (ciphertext, key ): plaintext = "" i = 0 for ch in ciphertext: if 0 == i % len (key_list): i = 0 if ch.isalpha(): if ch.isupper(): plaintext += letter_list[(ord (ch) - 65 - key_list[i]) % 26 ] i += 1 else : plaintext += letter_list[(ord (ch) - 97 - key_list[i]) % 26 ].lower() i += 1 else : plaintext += ch return plaintext if __name__ == '__main__' : print ("加密请按D,解密请按E:" ) user_input = input (); while (user_input != 'D' and user_input != 'E' ): print ("输入有误!请重新输入:" ) user_input = input () print ("请输入密钥:" ) key = input () while (False == key.isalpha()): print ("输入有误!密钥为字母,请重新输入:" ) key = input () key_list = Get_KeyList(key) if user_input == 'D' : print ("请输入明文:" ) plaintext = input () ciphertext = Encrypt(plaintext, key_list) print ("密文为:\n%s" % ciphertext) else : print ("请输入密文:" ) ciphertext = input () plaintext = Decrypt(ciphertext, key_list) print ("明文为:\n%s" % plaintext)
WP key尝试遍历3位
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 letter_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' def Get_KeyList (key ): key_list = [] for ch in key: key_list.append(ord (ch.upper()) - 65 ) return key_list def Encrypt (plaintext, key_list ): ciphertext = "" i = 0 for ch in plaintext: if 0 == i % len (key_list): i = 0 if ch.isalpha(): if ch.isupper(): ciphertext += letter_list[(ord (ch) - 65 + key_list[i]) % 26 ] i += 1 else : ciphertext += letter_list[(ord (ch) - 97 + key_list[i]) % 26 ].lower() i += 1 else : ciphertext += ch return ciphertext def Decrypt (ciphertext, key ): plaintext = "" i = 0 for ch in ciphertext: if 0 == i % len (key_list): i = 0 if ch.isalpha(): if ch.isupper(): plaintext += letter_list[(ord (ch) - 65 - key_list[i]) % 26 ] i += 1 else : plaintext += letter_list[(ord (ch) - 97 - key_list[i]) % 26 ].lower() i += 1 else : plaintext += ch return plaintext if __name__ == '__main__' : key = [] for i in range (len (letter_list)): for j in range (len (letter_list)): for k in range (len (letter_list)): key_list = [i,j,k] ciphertext = 'AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984}' plaintext = Decrypt(ciphertext, key_list) if "NSSCTF" in plaintext: print ("明文为:\n%s" % plaintext)
AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984} -》 NSSCTF{
像凯撒变种
维吉尼亚加密 利用网站 https://www.dcode.fr/vigenere-cipher 爆破
NSSCTF{dd5f0021-7a8e-ee05-f25e-7882abc5d984}
[SWPUCTF 2021
新生赛]crypto10 [维吉尼亚]
AFFPGS{pbatenghyngvbaf!!!},建议直接秒了 维吉尼亚直接爆破
NSSCTF{congratulations!!!}
[SWPUCTF 2021 新生赛]pigpig
[猪圈]
猪圈密码 http://www.hiencode.com/pigpen.html
w h e n t h e p i g w a n t t o e a t
[SWPUCTF 2022 新生赛]小明文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from gmpy2 import invertfrom Crypto.Util.number import getPrime, bytes_to_longfrom flag import getflage = 3 p = getPrime(1024 ) q = getPrime(1024 ) n = p * q phiN = (p - 1 ) * (q - 1 ) d = invert(e, phiN) m = bytes_to_long(getflag().encode()) c = pow (m, e, n) print ("c=" + str (c))
c = k*n + m^e → m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import gmpy2import libnumc = 128198926274489803523728445192921664 e = 3 n = 504229359204 k = 0 while 1 : res = gmpy2.iroot(c+k*n,e) if (res[1 ] == True ): print (libnum.n2s(int (res[0 ]))) break k = k+1
[SWPUCTF 2022 新生赛]爆破MD5
1 2 3 4 data='Boom_MD5****' flag=MD5(data) print (flag)
刚开始只跑了大小写+数字 没加符号没跑出来
随后加了符号 然后就是漫长的等待......
但是没跑出来 。 。 脚本好像有问题 额 。。
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 39 40 41 42 43 import hashlibimport stringdef md5_encrypt (input_string ): try : md5 = hashlib.md5() input_bytes = input_string.encode('utf-8' ) md5.update(input_bytes) encrypted_string = md5.hexdigest() return encrypted_string except Exception as e: return f"加密失败: {e} " additional_chars = '' .join([chr (i) for i in range (36 , 128 )]) all_letters_and_digits = string.ascii_letters + string.digits + additional_chars for i in all_letters_and_digits: for j in all_letters_and_digits: for k in all_letters_and_digits: for m in all_letters_and_digits: str = "Boom_MD5" + i + j + k + m md5str = md5_encrypt(str ).lower() print (str ,md5str) if "0618ac93d4631df725bceea74d0" in md5str: print (str ) print (md5str) break
[SWPUCTF 2022 新生赛]yafu分解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from gmpy2 import invertfrom Crypto.Util.number import getPrime, bytes_to_longfrom flag import getflage = 65537 p = getPrime(140 ) q = getPrime(140 ) n = p * q phiN = (p - 1 ) * (q - 1 ) d = invert(e, phiN) m = bytes_to_long(getflag().encode()) c = pow (m, e, n) print ("n=" + str (n))print ("c=" + str (c))
p q不是很大 yafu去分解素数
C:>yafu-Win32.exe
"factor(1851012829537540993346897265450988006921329733937556249710137670254755668838970157221)"
分解得到
P43 = 1362310363870711901033415700690289289304517
P43 = 1358730637766188714476624560503309609820513
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import gmpy2from Crypto.Util.number import long_to_bytesp = 1362310363870711901033415700690289289304517 q = 1358730637766188714476624560503309609820513 e = 65537 n = 1851012829537540993346897265450988006921329733937556249710137670254755668838970157221 c = 1165608868963663237838494928147497339359377331987999335624507621030816298293537918937 phi_n = (q-1 )*(p-1 ) d = gmpy2.invert(e,phi_n) m = pow (c,d,n) print (long_to_bytes(m))
然后凯撒解密 NSSCTF{fami1y_bi9_the_t0_We1c0me}
[SWPUCTF 2022 新生赛]AES
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 import base64from Crypto.Cipher import AESfrom flag import getflagiv = '1229002635654321' key = 'nssctfneedcrypto' data = getflag() def pad (data ): pad_data = data for i in range (0 , 16 - len (data)): pad_data = pad_data + ' ' return pad_data def AES_en (key, data ): if len (data) < 16 : data = pad(data) AES_obj = AES.new(key.encode("utf-8" ), AES.MODE_CBC, iv.encode("utf-8" )) AES_en_str = AES_obj.encrypt(data.encode("utf-8" )) AES_en_str = base64.b64encode(AES_en_str) AES_en_str = AES_en_str.decode("utf-8" ) return AES_en_str data = AES_en(key, data) print (data)
WP
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 import base64from Crypto.Cipher import AESdef pad (data ): pad_data = data for i in range (0 , 16 - len (data)): pad_data = pad_data + ' ' return pad_data def AES_en (key, data ): if len (data) < 16 : data = pad(data) AES_obj = AES.new(key.encode("utf-8" ), AES.MODE_CBC, iv.encode("utf-8" )) AES_en_str = AES_obj.encrypt(data.encode("utf-8" )) AES_en_str = base64.b64encode(AES_en_str) AES_en_str = AES_en_str.decode("utf-8" ) return AES_en_str iv = '1229002635654321' key = 'nssctfneedcrypto' data= "862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8=" def AES_de (key, data ): cipher = AES.new(key.encode("utf-8" ), AES.MODE_CBC, iv.encode("utf-8" )) data = data.encode("utf-8" ) data = base64.b64decode(data) data = cipher.decrypt(data) data = data.decode("utf-8" ) print (data) return data AES_de(key,data)
[SWPUCTF 2023 新生赛]EasyRSA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import libnum p=libnum.generate_prime(1024 ) q=libnum.generate_prime(1024 ) e=65537 m="NSSCTF{*******************}" m=libnum.s2n(m) n=p*q phi_n=(p-1 )*(q-1 ) d=libnum.invmod(e,phi_n) c=pow (m,e,n) print ("p=" ,p) print ("q=" ,q) print ("e=" ,e) print ("c=" ,c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import gmpy2from Crypto.Util.number import long_to_bytesp= 122912801126049869009003839542545176400185213365268209105714006257803073428638629824801261702125287814910668428403367391355051987389837804474055637991864563803834741161217607848968821280710324766558457056004037592628178078680121173634128054936108782807954132605887275556228703383455969903056759874047110115433 q= 120790113700754477830062212762518406876786376726996249661848284428829412089402183812692045970711341815805796005449714738748110749559462448861357011272792817313060401380148108517705435100103533857957024851181447994572972501120774586405811257420853542417275740953525627232008812587423053626515513859653865873671 e= 65537 c= 7094224488947659163318199615533819770556597977720767621640224798887506152292861133457571683713587909779712343346370719403811813233693263526316785431883833118583425528830238629831001255198236686372518770451273159769779374149881346761523688131115323441973953523582174059584087249568245044443295176738493785560215046375056269378223045128094953923926250055718405799885041115025529297362914403732661935017257507786348635366480744933193471899621592092711962814949533564454932121056035003021428158830645604347966849572981124877683317022116903132719663958775850982016292384237647664448371811915879714093710876989697939277005 n = p*q phi_n = (p-1 )*(q-1 ) d = gmpy2.invert(e,phi_n) m = pow (c,d,n) print (long_to_bytes(m))
[NSSRound#4 SWPU]ezcrypto LCG
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 from Crypto.Util.number import *from secret import flagclass Symbol : def __init__ (self ): self.alpha = getRandomNBitInteger(32 ) self.beta = getRandomNBitInteger(32 ) self.n = getPrime(32 ) self.seed = getRandomNBitInteger(32 ) def next (self ): self.seed = (self.alpha * self.seed + self.beta) % self.n return self.seed >> 16 def output (self ): print ("alpha = {}\nbeta = {}\nn = {}" .format (self.alpha, self.beta, self.n)) print ("res1 = {}" .format (self.next ())) print ("res2 = {}" .format (self.next ())) symbol = Symbol() symbol.output() c = b'' .join([long_to_bytes(ord (flag[i]) ^ (symbol.next () % 10 )) for i in range (len (flag))]) print (bytes_to_long(c))alpha = 2659869614 beta = 3138014669 n = 2171187379 res1 = 32421 res2 = 32382 628427670713408045832213770914678202267468957347245535228951062583137095137644250375583786099578
alpha beta seed 32位随机整数
n 32位素数
seed =(a * seed + b ) mod n
已知前两个连续的res值 res = seed >> 16
c[i] = flag[i] ^ ( ((a*seed+b)mod n )>>16 )%10
flag 前几位是 NSSCTF 为默认已知条件
X0 = c[0]^N
seed =(a * seed + b ) mod n
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 from Crypto.Util.number import long_to_bytesfrom tqdm import tqdmalpha = 2659869614 beta = 3138014669 n = 2171187379 res1 = 32421 res2 = 32382 c = 628427670713408045832213770914678202267468957347245535228951062583137095137644250375583786099578 c = long_to_bytes(c) for i in tqdm(range (0b111111010100101 << 16 , (0b111111010100101 << 16 ) + 2 ** 16 )): x = (alpha*i + beta)%n if x >> 16 == res2: y = (alpha*x + beta)%n if (y >> 16 )%10 == c[0 ]^ord ('N' ): print (i,x) else : continue res1=2124788500 res2=2122226329 def lcg (a,b,c ): x = (a*b+c)%n return x for i in c : res2 = lcg(res2,alpha,beta) print ( chr (((res2>>16 )%10 )^i),end='' )
[SWPUCTF 2023
秋季新生赛]小明文?
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 from Crypto.Util.number import *import randomm1=flag = b'NSSCTF{*******}' def encrypt1 (m1 ): p = getPrime(700 ) q = getPrime(700 ) n = p * q e = 5 a = getPrime(128 ) b = getPrime(128 ) m1 = bytes_to_long(m1) mm1 = a * m1 + b c1 = pow (m1, e, n) c2 = pow (mm1, e, n) print (f'n = {n} ' ) print (f'a = {a} ' ) print (f'b = {b} ' ) print (f'c1 = {c1} ' ) print (f'c2 = {c2} ' )
Related Message Attack:
利用条件:
如果两个信息之间M1
M2只存在已知的固定差异【线性关系】,并且使用相同的模数N下进行RSA加密
具体原理不看了【详细可看这里https://ctf-wiki.org/crypto/asymmetric/rsa/rsa_coppersmith_attack/#related-message-attack】
最终可推出如下式子
题目已知条件 c1 c2 a b,M2=aM1+b 线性关系,所以可以求出M2
直接套轮子[sage看不懂 直接拿过来了]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import libnumn = 13026126941826887019162872735099540876106694302074884925200107036130428843197729140372377590706535217469477301361486550282890330093772372813532795303163348233096919179478061917423707929667355386062657434467799360617526194768968700908096844475960205671302377364202483195391706116078632202015938962280529309403244885363904094804118278167720593581764017089021116316636464533785051436622916960956665030100255641288863474938703 a = 280807370135687531454416708417179457159 b = 210598260561987226227971066630761929397 c1 = 5484670538103757119990644460454986219076673914082966464351809153114702100411054106785392646801736865489738145857425179185164710603704198643749378051371008266521829572436350080663825339915763509501690398283916091505443322384568973565599179112299853287766734493187659418383619877040013434926843623979979122417950089001830664273269598688130410251828579862218274297572192961909808728768317567218412746711665911495028223620671 c2 = 249587944874112168607313602465869274336587750392364868939732783502223999305089384749508572630699199927194600499968110646290832205640569694933539973256281796631433129626712361622584048439446364992886884217198680921278383770604919381329363647924261642857483728973331091285820401689502291336332199019252649615680893389557508558362194551939434128389351824194393680744241807605416750291337127085044177563509645273228457253193 e=5 def franklinReiter (n,e,c1,c2,a,b ): PR.<x> = PolynomialRing(Zmod(n)) g1 = (x)^e - c1 g2 = (a*x+b)^e - c2 def gcd (g1, g2 ): while g2: g1, g2 = g2, g1 % g2 return g1.monic() return -gcd(g1, g2)[0 ] m=franklinReiter(n,e,c1,c2,a,b) print (libnum.n2s(int (m)))
[SWPUCTF 2022
新生赛]Phishing【没做出来 后面在研究下】
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 39 40 41 42 import gmpy2from Crypto.Util.number import *import hashlibp = getPrime(1024 ) q = getPrime(1024 ) n = p * q eAlice = 0x10001 eBob = 0x10003 phi = (p - 1 ) * (q - 1 ) def chatEncrypt (pepole, message ): if pepole == 'Alice' : sender = hashlib.sha256(str (pepole).encode()).hexdigest() sign = hashlib.sha256(str (message).encode()).hexdigest() encryptMessage = hex (pow (bytes_to_long(message), eAlice, n)) return sender, encryptMessage, sign elif pepole == 'Bob' : sender = hashlib.sha256(str (pepole).encode()).hexdigest() sign = hashlib.sha256(str (message).encode()).hexdigest() encryptMessage = hex (pow (bytes_to_long(message), eBob, n)) return sender, encryptMessage, sign chatLog = open ("Chatting.log" , "rb" ) encryptedChatLog = open ("ChatEncrypted.log" , "w+" ) log = [] for line in chatLog: log.append(line) chatLog.close() encryptedChatLog.write(hex (n)+'\n' ) for i in range (int (len (log)/2 )): if log[i*2 ] == b'Alice\r\n' : encryptedChatLog.write(str (chatEncrypt('Alice' , log[i*2 +1 ]))+'\n' ) print (chatEncrypt('Alice' , log[i*2 +1 ])) elif log[i*2 ] == b'Bob\r\n' : encryptedChatLog.write(str (chatEncrypt('Bob' , log[i*2 +1 ]))+'\n' ) print (chatEncrypt('Bob' , log[i*2 +1 ])) encryptedChatLog.close()
已知 eAlice = 0x10001、eBob = 0x10003
c = pow(m,e,n)
输出文件中包含 hex(n) 及 十六组 str(chatEncrypt('Alice', log[i*2+1]))
,其中sender和sign sha256加密 密文未加密
所以已知内容为 n 和16组c
使用同一个模数n进行加密 优先考虑共模攻击
n =
0x63651c7146a0e7b724297d4212b5128ede8631b886179f7c7770877317d0d7d91d74aa9a8763ef0b8640f0d3ec80ae2581af3bec1928a308d6e220e2b7bc7dbee675445c7503b8469ccb3b6d36b69a19e67aad605e83886f274308904e5cd660fb627899075dca6ba585001d4e0c4b496c79ea1952d961421eeda77b80ed3716d6eaba40de17848499adbf098b85e6807ee4fdea7059d5faf3b2b58d1e17322ce6f3747f1cd138db0593d630e97573bd42c8b02bac2d780b8b0b6ac915cb18f082af21c3c5a4849b6e8e19862b1160888bb069adb8bcbcf93693ea8993bc26c1321d36b137a215bf56dfe9af8ba511f5d89b016a68ca03d9bd14091c04027b01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 0x44e199407b72439f4fad42a3a13ff31fe22daacd0b1ec17f34f260ffa8a7be74b75ac624ab147b8342b0cd97024b1d7d40d5071bc65d62377b3eb2b718e086096084219360d7bf967ba961afa05054d968d8b3493870831e92622ead173ba41e3d345e068cc7640bb43f3ff9654ab48183f6dbe752ee26b9c908d4b31fcb8e445963ef261e99bc238441a2c0e82fdf07359702d0ab664ab216995c7e27d91e885a5ee37ae1f6895a7d38155edcd8990c36fa2ac6d7e14abec471cc96a8ba34497f3073e0906f683145e03fc38c8fa40ba4250d2d907f3071c3db30d941b321c349d9d800bed6be61b00a3797aef85f7fb2cc36413556f6438fae3b9476adab6e 0x10cde6bdf0ac17952be139709d97fa574bfbeffd22e9a0c0fde85811797decfd4b8c669df862a476c66ae47e2831d23f1dde85290a58489a8cabf9f8bf4e94c80009634ee2deb13391c1ede5005a4fd3a58b08b185eb4d10081f34676c3bf546ae641141e63bab05ca9e40bdd5c9422857f5da5a3f3f14f87a2235196dad758065d0108b8a450939fe5084cea40d8ab8e1f5b87df21def507285464cb26e2cc5ad3ade03d83ac74557ec51c4eb2422dc45b7022cca62a4d1896bf13fef9bb38f5dc44d2ce6ab28222655ed27104b1e18f2baaa9bbc4200e8cf531cda25c9ae4f07e79885efc7b7fb3dcad0f07de66a1a1708f6bc96906a184caea4d23d1af4cf 0x31d25cdd014ad6ccef4e417ee1a1a59ebff514979887b9e05bda8a577dd8f3b62fa4ef09780b96d5878957a2ab11116b3a1d77e26cc4a0510f83fb86247170798aa0470215ea0cf1646291ee111e70fb83094a73d6f4540957ac428094c806ed2a6fb68db8c47170ae747375277deda72aaf887c09c06e372c62af6ee559f96e13b9f2d4f7a72df4b4d9bfb8975510ae165da5d0ed9727c9168669d2bc762cd49bcf316d3bc4d29e9429016f4ba5f1b12390c433248cb443c97df5fe6992016543054150af623edaf29ef81b231491bafbbbe0f607dd754f5d6d702a44a9b99533174a6c4bb6e727683c05a908bffdfdb629972f51f4ef698bbffebed566a0c5 0x7b1ef6b4cb43ca5747d17ebf5a42d49b0f24b65a13101dfeb995a9cf753f45afd65c93d908629c008ea8d6577cb6c32960486b838d335974ab15a58d38a39a8d8f6b16a0369da059d2a5298bc4efb6491ef4537e958e693c17acdded7fd527548a0800f6f1a79ba484f2c4b15662b2bee4e5286b1972b3fd78b2d9ba5b5b1c58cb6e226fb55f4e6c266ef69aff05971a9594fc9f96ffbb98022fb744c3e081e59afccaf9258f6f5921765c5324b2ff3dc3d64c6164d2f26cbaadec66669e8e77b9f9196cfa46e68cb3f5f53435e016297f9d0ce9131d9dbaee616b34eb5ebd871d50226dae36e648a3e351cb9e46969ad7d578d367ca546d062f3ab0313eb9b 0x401156c77529718d7a5fff5889703d9d000f1e8324d76eb05728fe83b3a9f9a689abd4b01af9c036c35025c21603d4256b5edd12803192030ca198be70ead4f6113b147e8e3f0d3743cf3e7aebf22151b468ccacd681989158afdfc61dbd46d8d67e85d09491217a065ec04d4b12f2e31098802e1094f06aaa8a8c43785496243e881f81fb90254dd3342699e6c433f8f603c00605d6b34c6ec3117cf78fcb1a72a9bab83e05d1b489148a90f7816fa5f84fde195ba1bcddb26df6b78ceb09d919807b7bb7b7cce257b23fb34508d1ffaaec17cf5e1f66ea31e692d077859ca16ee24cd2d6923744c98cafbf39c41c0bbf68a6c086b62614792e23038643c955 0x469ff6f3649b902be1e3b59aa68eee1b10a1056e109872b42c00a3d574ab13337e4b09d094e1a43b16d4c5ebd266266e2564cf3b630a3d3207b5aacfa7f50ab621034a7dfcd231ed3247e74093c4836bfefc6af53857ee09d242bcd346bcb9e6e1cfae3c38fcee9f3cc22fe51d7a9ac96f914a0f0985639c8aeafd254f0c6304398138c256c1c80e4969d7d3d4ce2e8885608bc2d8d83bf7a218aaae015341bbf7d873d54a4ec0afce0b6a7898df840b4b682276c394ca3a38e688b8aeea675ede5d28908a89d59c98321b3c14900d4a89249784a12066d385312ae307a8438c8e49b42b1d234546e46c1536ae0b5178abc609d9061b5a8711ae6c2a7140a23e 0x1c39de925a76c7207714684fc339567cd439a106ee1b2c09232652f899f798c459629de9d4ba464666d1a050642964d446762b9be80bb417aa411ae81d30751acdda9d914581fb8715853aaa8869bcf6050c0a9f6a0060a888f3353298e5617f0c1807a711418ef91d7662864187c360c48a6988a7004e6a786a3071bebfb1198456f7fa5a2a651fa31cd8b0c1e9fbb515a37977dccfce79784617e83c760d6bba6e65cc566e96a01143c9ee7dfca95bae3a4af0f30eb579a0ad8a8be453bbcf147dc9c2a048d877621e507d208e6105929d5beb28bc86e58570b8e2d32927d7d7f65dc4ee929abb85a7cc73194ebb4f4ff84213f28dabfd81eaac5c8ad9ab5 0x256996daa2c9dae14a986ff70f0f453b1b12bcbbce4232380e4145e141684fbbe91ab67c524159487ca26726690f8da588cc7af61801ab3065290bfa4d440b85803fc3b9d010d346c7b4f7f2b8f0b3253102f10e6812592bac933712b71baf0cf470d0b782894693dd256c2ead766c3c271fb45d65008316511710d22ea318cef51731c598314101846a7f9674fba6adbddffa16bb15ea03021c54038e46c7a4846f45211ba17e733577153a78a7ec1d463d07e7e7c1ac8cfe06625ff3aac27d2f651ef04618ec6107652b0627528748640b0c9e7a446e5cdece79080b0009eab5ba41e0db367049ce69687ba2cae8481761b87fd0e6a7ba5e84ac55a5231d0f 0x5a045180ce4cbcdb8d4f48ae4fafb4dab8b3a1a829afd15f3aa5afa90c03aca9eb6b1dec208594580fba45b8af15cf7ac60031cb9c28e402a0a563fcf9feeed7c05de10104560fb1e66463be3573fc98d7b4178fb1d9c99af7cbc4da65fbb40b5fe26bd78bb83e94236136e0ab86f9228963b90d926abb8002f9e6a8ad695a826c12454e6bf6d44624188d8454e4afa133ed9cffcf504239bc2df4eddb0910f47047858da710dd1ef7b96b2430b69fc78b3a8e4d19657b4fb2fbcbac656e851d86fee14f487a4e4fcca93fef24eb9e3f72ee3aebe0aa27e14a2889c13410a22a4ff99802729a1e802b1e343abe51f99f9b131e6e932ef6336cb2539befc7ad2b 0x2ca6110b03ecad45d9f8969c6a47e4e434708288bb35738f4e1974647ae4ac5782377117bf96a25936c5f049ce5fb89aeb9022c99f1eb2085f0a2e9e06f5bdd7c512dea7fa839ae55eb78d95f8ed9a34e35fe901cd499efe116142976e6170c85987cb1355ddf1d7cf6e66120a355ae02cce4ccef86ae27860f55c61249cf5b6daf728c570bfeb8f03f6dfab1cf168ab16e7e1efe1582f9717d449984184c604ec5af6070837b1350dfaf188b6bb76ad81f5c70804fa7a79d2c1c5f8de9b5cb9ed859bf75f912c445fed04252edfa590e2354b72d08331ab631b9d59835435e6c0e80e418ba6c2e1655ca7ef19555b792f768c2d07bc7deabfc8c06a9061d987 0x148dce72b5b82bcc8bda6d5d2aa0ef4c665b647edb4e588058519c9b4fd3c25fc24f73569bdf14491d5a6ecc01aa6ee797711e612b7e271f2f551407b7f73c2b5fe9bba6168777bd82a4ef3c5ac46bdb339a43ccdea2ca913141eb909ae7e03cba79331556f3111679878748819175f921a114c57c001d22fe4ef26bed7c56725fd982d4fa356b2e25e962a88471feef63e82c9640b0293b98e1971ab78111e76fd485dc6c53ec656266759c2c9b4a2465ad1618fa7d89454161b1d799c90af1d055d9749a49c8aa9a1d956683841c234641e0ca30d97865355da3c5879db378ef9c44e78320c4f97ae50c385cb1e4877c2ec2c1fa64915625654ba0c8c01efa 0x4449cb7346cd8bc4c4fc0e0c492cc40a1b4f1a3f93815eb19353fb82a3c34cfdfe91bc01a80f779998185a6a36cf68094641367fd912f146d9ec793bf88d2fea7f793375ea4d79e95c8c18e8dc83e0d7590fe007862024e82786e11754ecb4b93c19c01550631196fcaa34b73646125b1baa8fd8726d99f9752abad9a5e2136e0a909700a0423fbd97865b87790c6e16b85a51aa7dd987e84cc7a8f4617a0de31f4d1c538587a8fd8b91b50f8551c306c3240339c8d89f9a6842f65f59db0ac935640f998e705ec6dad8b5403e786bcbc901b9cdaa671fe5d05707d637772199779bce17e7942eb185aa86ce668863261f85539696b5a5835826f67cd25acd49 0x2197e3bc7c4bc600dac76f2b4dce190bba84f5a2df71e086efa5d9e1891d93ef7a722a8912c65c71a39fd495da83078ba4ecfae537e7cce6ca4cc2621e6f019fc10a322fffc66d4a2f9d0674c300df5c5cb290d8ad0228b5a22d86a4e99c171ce2d29f0ad52fa07b17fb6accfba6e78af4c3c1f5f578c7b496df797cc38b9c8a61b6b1fdc5648291753283d6dc3dc11e10ad5513bbb4b579a0b1c07c92fdb59df8a4f036e050e4d4668586f16685810f2e8cf62763d1d17fc493ad04ded7fd64e09b8299eeb5aa51b2e4287bec9b042285e49e04adfee80235eea001b3443976e460dd87710343c503129924e8cbb5b71849f3cb07fe9d7956c688e7521cbbae 0x224fda6f7940f6a120d586691428da3a93baec1d4be63ddad058b00a78d311a111aaf3174d6ab8bffb5403c8b721cd64d5440da5607d7d8729ee732fd86e2407c2fdc8ad3bba763e856c2a517cafeae8465952ff0854d712fdbb410f924e5bac561411beaaddf5c02536f273704a14b5de13c51cba3dc029bd2c7250f972b1679e1f21acdc27cda6c33b72a4258f68d00395e82c2f0d92c153ad5240b26ef581e0b5ba78c0c9409a5fb02f4d49707e9b941e0ad37e22ef9c42a568a10b000e91059650b620fd69552c4d267ed1b479378e60870cfd2026d248d32b9600f3b8ba2c7d05c6872847e43760d51d3b69e85449d21a3eb5eeef82d450a803b4500b79 0x32b9ecdea94109ebb2fac3a1bbc8605a2e7f3622a2559e1e0811921881b736de43771ba97d0c071ea05caa613c84f4f3b8f553f2ca2eccc1c3c8708ded528a7fc34881530a95d95dae4bdd27967f0b8b706530725d62447d732615825aadd901fa86675431e245aa1c3937d5f4d76f06a52caa8ca2100a9568c1817f14c6e6bb01f7d4543bd0d985ad2e1ee4310db1eafa37ae90b38582ef6212552e8bf6c6cbd483ae580a65b4171dd6bb767b3ae50d6a0f8bc9d45ca7d2ec12bea582b7aa39c3df3e20c2de9851456f111719b4ea6fe2d9c3ada0787ec83e4a7e5a2348b58526d4d267db693e508599f9cd31729a36d510aec40c756974a6f1e825fbcfc1d1 0x1ceec14e3fea63e688f500df76526d391cb411aba993a7407671e234698441e4c3c80efdf0092f0f7af0e14cedde5efe144ee8db2b5a0e7f8f300ca49f81dd189a83527f0c846ac1cbed4ba909f8df04efdeacaa616c005a609f43cdafac49ce49b482a5e244e1cd96fb4643066887d8d858314e816dd08df711b46fded216c4b8bee5a24379522e73a84e53ae0d778e47e7c5e96869a1666d90abea5638719932baf857745e50d3f32933d62d9bbffdc8d6b1ca6232e2bca8533afdd5b4175ed61db1e604d9645594b3dcf89e0550175bbb6d3de99598c665911c26e824f36b277681cfa802989c8b010d2143fe94ebef8dee4da4e5a4f097fb3a22b1242c52
[SWPUCTF 2023
秋季新生赛]dpdp 【dp泄露】
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 *from libnum import *flag = b'NSSCTF{******}' + b'1010101010101010101010101010101010101010100010101010101010101010101101' p = getPrime(512 ) q = getPrime(512 ) n = p*q e = 65537 d = inverse(e, (p-1 )*(q-1 )) dp = d % (p-1 ) m = s2n(flag) c = pow (m, e, n) print (f'n = {n} ' )print (f'c = {c} ' )print (f'dp = {dp} ' )n = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441 c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274 dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973
dp泄露 可用下面这个板子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import gmpy2from Crypto.Util.number import long_to_bytesn = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441 c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274 dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973 e = 65537 for i in range (1 , e): if (dp * e - 1 ) % i == 0 : if n % (((dp * e - 1 ) // i) + 1 ) == 0 : p = ((dp * e - 1 ) // i) + 1 q = n // (((dp * e - 1 ) // i) + 1 ) phi = (q - 1 ) * (p - 1 ) d = gmpy2.invert(e, phi) m = pow (c, d, n) print (m)print (hex (m)[2 :])print (bytes .fromhex(hex (m)[2 :]))
[SWPUCTF 2023
秋季新生赛]dpdpdpdp [还没做]
和上面题相比 e变得很大 所以无法用之前遍历的方式
可以使用维纳攻击
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from Crypto.Util.number import *flag = b'NSSCTF{******}' p = getPrime(512 ) q = getPrime(512 ) n = p*q e = getPrime(128 ) d = inverse(e, (p-1 )*(q-1 )) dp = d % (p-1 ) m = bytes_to_long(flag) c = pow (m, e, n) print (f'n = {n} ' )print (f'e = {e} ' )print (f'c = {c} ' )print (f'dp = {dp} ' )n = 92288362151232755164303382554034496430634785857894506752180261103500715219090974532177552845107426542175470207920267802066773828210866572070045093611090322738109527534622730588618668861998969946471756352024368486322527057077613762697792913167023012077178671066981439295386486943067698150993422039585259179729 e = 229991316986730339421575788374847647237 c = 66178170892880340054212366602556925884485962775832591797127163461420023986798822926684824340567060840259672460835004142425374706821346941926520921852009455818529825976414766339170445233789109526300838535719649346266975388774091834431039678689254534566870194580604694419819400454951059125553501095973278807456 dp = 8987556601717285362487353965045062789633142861774364363374961991445049127918653163458814169532860957264061203394944931114888144611267605606197232438332289