文章总结: 该文档详细解析了5道CTF密码学题目解法,涉及九宫格键盘编码解码、RSA孪生素数攻击(通过yafu分解n)、e=1时的明文直接提取、Base64+栅栏密码组合破译、共模攻击(扩展欧几里得算法求解)。关键发现包括针对特殊参数RSA的实用破解技巧,可操作建议涵盖具体工具使用(如yafu、随波逐流解码器)和Python脚本实现加解密流程。 综合评分: 74 文章分类: CTF,WEB安全,代码审计,安全工具,密码学
CTFPlus-密码学每周练习-奇怪的短信、Ez_RSA、RSA?、ezCrypto、babyRSA
原创
李北辰 李北辰
SPEEDCoding
2026年6月27日 14:53 山西
在小说阅读器读本章
去阅读
#
1. 奇怪的短信
短信内容是:335321414374744361715332
拖入随波逐流解码,发现是九宫格键盘编码:
2. Ez_RSA
题目文件是一个python脚本:
from Crypto.Util.number import getPrime, bytes_to_longimport gmpy2def generate_twin_primes(bits, delta_bits): """生成间距极小的孪生素数""" p = getPrime(bits) q = p + (1 << delta_bits) # 设置素数间距为2^delta_bits while not gmpy2.is_prime(q): q += 2 # 保持奇数特性 return p, q# 安全参数bits = 512delta_bits = 18 # |p-q| ≈ 2^18p, q = generate_twin_primes(bits, delta_bits)# 加密流程n = p * qe = 65537# 真实CTF中会删除此行,仅保留加密结果m = bytes_to_long(flag)c = pow(m, e, n)# 仅输出公开参数print("[+] 公开的RSA参数:")print(f"n = {n}")print(f"e = {e}")print(f"c = {c}")#n = 156015412971134825784995317753399683894906793391308032626888615976930925748500176423984400218274373730878087646971649297488998628926317502352437085740879970415010398250501458046160378576412025008488504577864728979671718404518999445105511632801253199467687301754361012571700473381930563891632815395065300635357#e = 65537#c =145659164213625745393731913671198533318773493955865949134151384195147607511261373290164813518695360211148466970760974852185584184837376376039163766504104222029224517534603434140831986412683498654473368081081077806357860045809479182485360340123081484936709292496026637791199418448869603320211940344310493770879
给了n、e、c,然后p和q的生成算法,首先使用yafu因式分解n得到p和q:
然后写python脚本进行解密c:
import gmpy2import binasciip = 12490612994210285185822125788537718180229091672597001124723418817980815919026153698854362083537424897294344975322996570504070535675249475750072701982231499q = 12490612994210285185822125788537718180229091672597001124723418817980815919026153698854362083537424897294344975322996570504070535675249475750072701981969143e = 65537c = 145659164213625745393731913671198533318773493955865949134151384195147607511261373290164813518695360211148466970760974852185584184837376376039163766504104222029224517534603434140831986412683498654473368081081077806357860045809479182485360340123081484936709292496026637791199418448869603320211940344310493770879phi = (p-1)*(q-1)d = gmpy2.invert(e,phi)m = gmpy2.powmod(c, d, p * q)print(binascii.unhexlify(hex(m)[2:]).decode('utf-8'))
得到flag:
3. RSA?
题目附件给了n,e,c
N=0x180be86dc898a3c3a710e52b31de460f8f350610bf63e6b2203c08fddad44601d96eb454a34dab7684589bc32b19eb27cffff8c07179e349ddb62898ae896f8c681796052ae1598bd41f35491175c9b60ae2260d0d4ebac05b4b6f2677a7609c2fe6194fe7b63841cec632e3a2f55d0cb09df08eacea34394ad473577dea5131552b0b30efac31c59087bfe603d2b13bed7d14967bfd489157aa01b14b4e1bd08d9b92ec0c319aeb8fedd535c56770aac95247d116d59cae2f99c3b51f43093fd39c10f93830c1ece75ee37e5fcdc5b174052eccadcadeda2f1b3a4a87184041d5c1a6a0b2eeaa3c3a1227bc27e130e67ac397b375ffe7c873e9b1c649812edcde=0x1c=0x4963654354467b66616c6c735f61706172745f736f5f656173696c795f616e645f7265617373656d626c65645f736f5f63727564656c797d
这里e=1,导致原来的加密方法:c = m^e mod n变成c = m mod n,RSA加密中m<n,所以c=m,这时密文和明文相同,直接把c转换成字符串即可:
import binasciic=0x4963654354467b66616c6c735f61706172745f736f5f656173696c795f616e645f7265617373656d626c65645f736f5f63727564656c797dprint(binascii.unhexlify(hex(c)[2:]))
输出flag:
4. ezCrypto
题目给了一段编码:
ZmF7NHlDeXRfdXViYzBsZzNzX3Jwb2Jjb3V1fQ==
先base64解码:
fa{4yCyt_uubc0lg3s_rpobcouu}
然后再栅栏fence解码,栏数为2:
flag{34sy_Crypto_bucuobucu0}
5. babyRSA
下载题目附件,是一个python脚本:
import gmpy2from Crypto.Util.number import bytes_to_long, getStrongPrimeflag = b"FZNCTF{xxxxxxxxxxxxxxxxxxxxxx}"m = bytes_to_long(flag)p = getStrongPrime(1024)q = getStrongPrime(1024)n = p * qe1 = 65537e2 = 2333assert gmpy2.gcd(e1, e2) == 1c1 = pow(m, e1, n)c2 = pow(m, e2, n)print("n = ", n)print("c1 = ", c1)print("c2 = ", c2)'''n = 20116181115185256137151544962617461969127485079539874123483790179691451026659727409952002522890170053136432251484598758202749921581090222404128778286934496528266389586853622784941814905724374659722595150921699219297623333597701057604954651692729250881800409786303147914726282180533059864870515367790648247781809163302813093152120079755029826297153011886828297246071460547641705486357297417233767122432498694486964352342801912061641754894572829465334992075139630449930115173945624459850685926333265959551792326024379566586598102224813413893610109613076229994854338779713676554568790353735720642800095499489845542499243c1 = 12574615186232508658058781239986357997690221455470707882708919538344867889046756940392586425215083828833917124513057649780713973391884806015516720789553246206689136824212927709627728801288304629797527956697243414600762350309939098109707454770146886759387428373061131102235552303687641823437812335805429238591967849935403611629054866383093303269886760991083623181420555220699498615783586898665752705379697907365417049724321589193519522361497873285356095894318360385694468646045503420079559869794438944147268173957051158766280963203638656844473553699835099487100606197891044561669390594778573658401240732422863142027023c2 = 8662571349644155432847824828393121776098409938437916669251107156874603954233944520039184762114790042807930511195272715449923236367967421315595229284040395158368328305331059953339506075385510377512416235056474493145376149687125036012499178684540639274797034307771820863938251633851132423882652884158338847776108707048056678532767030904154141724336547346190841924329986431350894721191694788035732072169271856487733779585742838903331792853668246043440328934976370767441620664696662437609635592559825455438053522844176591659902503216608366261175995953153271651775486985191394510128456927543378761783994086684673696547021'''
这里给了c1、c2、e1、e2、n,可以使用共模攻击,扩展欧几里得算法找出a和b,满足ae1+b*e2=1,构造出等式:
c1^a * c2^b mod n = ((m^e1 mod n)^a * (m^e2 mod n)^b) mod n = m^(a*e1 + b * e2) mod n,这里因为a和b满足ae1+b*e2=1,所以m= c1^a * c2^b mod n
求解python代码为:
import gmpy2import binasciin = 20116181115185256137151544962617461969127485079539874123483790179691451026659727409952002522890170053136432251484598758202749921581090222404128778286934496528266389586853622784941814905724374659722595150921699219297623333597701057604954651692729250881800409786303147914726282180533059864870515367790648247781809163302813093152120079755029826297153011886828297246071460547641705486357297417233767122432498694486964352342801912061641754894572829465334992075139630449930115173945624459850685926333265959551792326024379566586598102224813413893610109613076229994854338779713676554568790353735720642800095499489845542499243c1 = 12574615186232508658058781239986357997690221455470707882708919538344867889046756940392586425215083828833917124513057649780713973391884806015516720789553246206689136824212927709627728801288304629797527956697243414600762350309939098109707454770146886759387428373061131102235552303687641823437812335805429238591967849935403611629054866383093303269886760991083623181420555220699498615783586898665752705379697907365417049724321589193519522361497873285356095894318360385694468646045503420079559869794438944147268173957051158766280963203638656844473553699835099487100606197891044561669390594778573658401240732422863142027023c2 = 8662571349644155432847824828393121776098409938437916669251107156874603954233944520039184762114790042807930511195272715449923236367967421315595229284040395158368328305331059953339506075385510377512416235056474493145376149687125036012499178684540639274797034307771820863938251633851132423882652884158338847776108707048056678532767030904154141724336547346190841924329986431350894721191694788035732072169271856487733779585742838903331792853668246043440328934976370767441620664696662437609635592559825455438053522844176591659902503216608366261175995953153271651775486985191394510128456927543378761783994086684673696547021e1 = 65537e2 = 2333s = gmpy2.gcdext(e1,e2)a = s[1]b = s[2]if a < 0: a = -a c1 = gmpy2.invert(c1, n)else: b = -b c2 = gmpy2.invert(c2, n)m = (gmpy2.powmod(c1, a, n) * gmpy2.powmod(c2, b, n)) % nprint(binascii.unhexlify((hex(m)[2:])))
输出flag:
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SPEEDCoding 李北辰 李北辰《CTFPlus-密码学每周练习-奇怪的短信、Ez_RSA、RSA?、ezCrypto、babyRSA》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论