CTFPlus-密码学每周练习-奇怪的短信、Ez_RSA、RSA?、ezCrypto、babyRSA

admin 2026-06-30 07:05:56 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档详细解析了5道CTF密码学题目解法,涉及九宫格键盘编码解码、RSA孪生素数攻击(通过yafu分解n)、e=1时的明文直接提取、Base64+栅栏密码组合破译、共模攻击(扩展欧几里得算法求解)。关键发现包括针对特殊参数RSA的实用破解技巧,可操作建议涵盖具体工具使用(如yafu、随波逐流解码器)和Python脚本实现加解密流程。 综合评分: 74 文章分类: CTF,WEB安全,代码审计,安全工具,密码学


cover_image

CTFPlus-密码学每周练习-奇怪的短信、Ez_RSA、RSA?、ezCrypto、babyRSA

原创

李北辰 李北辰

SPEEDCoding

2026年6月27日 14:53 山西

在小说阅读器读本章

去阅读

#

1. 奇怪的短信

短信内容是:335321414374744361715332

拖入随波逐流解码,发现是九宫格键盘编码:

2. Ez_RSA

题目文件是一个python脚本:

from&nbsp;Crypto.Util.number&nbsp;import&nbsp;getPrime, bytes_to_longimport&nbsp;gmpy2def&nbsp;generate_twin_primes(bits, delta_bits):&nbsp; &nbsp;&nbsp;"""生成间距极小的孪生素数"""&nbsp; &nbsp; p = getPrime(bits)&nbsp; &nbsp; q = p + (1&nbsp;<< delta_bits) &nbsp;# 设置素数间距为2^delta_bits&nbsp; &nbsp;&nbsp;while&nbsp;not&nbsp;gmpy2.is_prime(q):&nbsp; &nbsp; &nbsp; &nbsp; q +=&nbsp;2&nbsp;&nbsp;# 保持奇数特性&nbsp; &nbsp;&nbsp;return&nbsp;p, q# 安全参数bits =&nbsp;512delta_bits =&nbsp;18&nbsp;&nbsp;# |p-q| ≈ 2^18p, q = generate_twin_primes(bits, delta_bits)# 加密流程n = p * qe =&nbsp;65537# 真实CTF中会删除此行,仅保留加密结果m = bytes_to_long(flag)c =&nbsp;pow(m, e, n)# 仅输出公开参数print("[+] 公开的RSA参数:")print(f"n =&nbsp;{n}")print(f"e =&nbsp;{e}")print(f"c =&nbsp;{c}")#n&nbsp;=&nbsp;156015412971134825784995317753399683894906793391308032626888615976930925748500176423984400218274373730878087646971649297488998628926317502352437085740879970415010398250501458046160378576412025008488504577864728979671718404518999445105511632801253199467687301754361012571700473381930563891632815395065300635357#e&nbsp;=&nbsp;65537#c&nbsp;=145659164213625745393731913671198533318773493955865949134151384195147607511261373290164813518695360211148466970760974852185584184837376376039163766504104222029224517534603434140831986412683498654473368081081077806357860045809479182485360340123081484936709292496026637791199418448869603320211940344310493770879

给了n、e、c,然后p和q的生成算法,首先使用yafu因式分解n得到p和q:

然后写python脚本进行解密c:

import&nbsp;gmpy2import&nbsp;binasciip&nbsp;=&nbsp;12490612994210285185822125788537718180229091672597001124723418817980815919026153698854362083537424897294344975322996570504070535675249475750072701982231499q&nbsp;=&nbsp;12490612994210285185822125788537718180229091672597001124723418817980815919026153698854362083537424897294344975322996570504070535675249475750072701981969143e&nbsp;=&nbsp;65537c&nbsp;=&nbsp;145659164213625745393731913671198533318773493955865949134151384195147607511261373290164813518695360211148466970760974852185584184837376376039163766504104222029224517534603434140831986412683498654473368081081077806357860045809479182485360340123081484936709292496026637791199418448869603320211940344310493770879phi&nbsp;= (p-1)*(q-1)d&nbsp;= gmpy2.invert(e,phi)m&nbsp;= 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&nbsp;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&nbsp;gmpy2from&nbsp;Crypto.Util.number&nbsp;import&nbsp;bytes_to_long, getStrongPrimeflag =&nbsp;b"FZNCTF{xxxxxxxxxxxxxxxxxxxxxx}"m = bytes_to_long(flag)p = getStrongPrime(1024)q = getStrongPrime(1024)n = p * qe1 =&nbsp;65537e2 =&nbsp;2333assert&nbsp;gmpy2.gcd(e1, e2) ==&nbsp;1c1 =&nbsp;pow(m, e1, n)c2 =&nbsp;pow(m, e2, n)print("n = ", n)print("c1 = ", c1)print("c2 = ", c2)'''n = &nbsp;20116181115185256137151544962617461969127485079539874123483790179691451026659727409952002522890170053136432251484598758202749921581090222404128778286934496528266389586853622784941814905724374659722595150921699219297623333597701057604954651692729250881800409786303147914726282180533059864870515367790648247781809163302813093152120079755029826297153011886828297246071460547641705486357297417233767122432498694486964352342801912061641754894572829465334992075139630449930115173945624459850685926333265959551792326024379566586598102224813413893610109613076229994854338779713676554568790353735720642800095499489845542499243c1 = &nbsp;12574615186232508658058781239986357997690221455470707882708919538344867889046756940392586425215083828833917124513057649780713973391884806015516720789553246206689136824212927709627728801288304629797527956697243414600762350309939098109707454770146886759387428373061131102235552303687641823437812335805429238591967849935403611629054866383093303269886760991083623181420555220699498615783586898665752705379697907365417049724321589193519522361497873285356095894318360385694468646045503420079559869794438944147268173957051158766280963203638656844473553699835099487100606197891044561669390594778573658401240732422863142027023c2 = &nbsp;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 = &nbsp;20116181115185256137151544962617461969127485079539874123483790179691451026659727409952002522890170053136432251484598758202749921581090222404128778286934496528266389586853622784941814905724374659722595150921699219297623333597701057604954651692729250881800409786303147914726282180533059864870515367790648247781809163302813093152120079755029826297153011886828297246071460547641705486357297417233767122432498694486964352342801912061641754894572829465334992075139630449930115173945624459850685926333265959551792326024379566586598102224813413893610109613076229994854338779713676554568790353735720642800095499489845542499243c1 = &nbsp;12574615186232508658058781239986357997690221455470707882708919538344867889046756940392586425215083828833917124513057649780713973391884806015516720789553246206689136824212927709627728801288304629797527956697243414600762350309939098109707454770146886759387428373061131102235552303687641823437812335805429238591967849935403611629054866383093303269886760991083623181420555220699498615783586898665752705379697907365417049724321589193519522361497873285356095894318360385694468646045503420079559869794438944147268173957051158766280963203638656844473553699835099487100606197891044561669390594778573658401240732422863142027023c2 = &nbsp;8662571349644155432847824828393121776098409938437916669251107156874603954233944520039184762114790042807930511195272715449923236367967421315595229284040395158368328305331059953339506075385510377512416235056474493145376149687125036012499178684540639274797034307771820863938251633851132423882652884158338847776108707048056678532767030904154141724336547346190841924329986431350894721191694788035732072169271856487733779585742838903331792853668246043440328934976370767441620664696662437609635592559825455438053522844176591659902503216608366261175995953153271651775486985191394510128456927543378761783994086684673696547021e1 = 65537e2 = 2333s = gmpy2.gcdext(e1,e2)a = s[1]b = s[2]if a < 0:&nbsp; &nbsp; a = -a&nbsp; &nbsp; c1 = gmpy2.invert(c1, n)else:&nbsp; &nbsp; b = -b&nbsp; &nbsp; 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》

评论:0   参与:  0