funnyrsa1 - CTFshow

e1 = 14606334023791426
p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248

e2 = 13813369129257838
p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649
c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919

按照正常的rsa流程来做会报错,观察发现gcd(e_1,\phi_1)=gcd(e_2,\phi_2)=14,且两组数据的p是相同的,需要考虑新的方法。

初步探索

先设e=ab,其中b=14

我们知道de\equiv 1\ mod\ \phi(n)

所以abd\equiv 1\ mod\ \phi(n)

因为a\phi(n)是互素的,所以我们可以求a^{-1},也就是bd

因为m\equiv c^d\ mod\ n

所以m^b\equiv c^{bd}\ mod\ n

这样我们就可以得到

res_1\equiv m^{14}\equiv\ c^{bd_1}\ mod\ n_1

res_2\equiv m^{14}\equiv c^{bd_2}\ mod\ n_2

这里的res_1,res_2都不是真正的m^{14},只是与m^{14}同余而已,这里一定要注意

由于n_1,n_2不互素,没办法用中国剩余定理求解,于是想到将上面两式其拆解成三个式子:

c_1\equiv m^{14}\equiv res_1\ mod\ p

c_2\equiv m^{14}\equiv res_1\ mod\ q_1

c_3\equiv m^{14}\equiv res_2\ mod\ q_2

c_1,c_2,c_3都是新的变量,与题目所给的c_1,c_2没有关系

现在p,q_1,q_2互素,使用libnum库提供的solve_crt函数就可以求解出res

这里大部分题解都说res其实就是m^{14},我个人其实偏向于不是。因为根据定义,res仅仅是模pq_1q_2意义下的唯一解,但我们并不知道m^{14}是否在这个范围之内(或者只是单纯我菜)。不过这道题不管是或不是都是一个方法所以无所谓了,欢迎大佬们解答这个问题

构造rsa数据

现在有res\equiv m^{14}\ mod\ q_1q_2

接下来我们构造一组新的rsa数据,res作为cm^2作为mq_1q_2作为ne=7

这样上式就被我们改造成c\equiv m^e\ mod\ n

是不是很眼熟?没错,就是正儿八经的rsa。至此,有模板的可以套模板,有工具的可以用工具,前途一片光明

这里大家可能会有些疑问,比如为什么e不设为14,为什么不选n_1,n_2作为模数等等,只需要时刻记得e,\phi(n)需要互素就好了

最后我们求出来的是m^2,现在就可以开方了

参考代码

e1 = 14606334023791426
e2 = 13813369129257838

p = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649

c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248
c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919

import gmpy2 as gp
from Crypto.Util.number import *
from libnum import *

n1 = p * q1
n2 = p * q2

a1 = e1 // 14
a2 = e2 // 14

phi1 = (p - 1) * (q1 - 1)
phi2 = (p - 1) * (q2 - 1)

bd1 = gp.invert(a1, phi1)
bd2 = gp.invert(a2, phi2)

res1 = gp.powmod(c1, bd1, n1)
res2 = gp.powmod(c2, bd2, n2)

c1 = res1 % p
c2 = res1 % q1
c3 = res2 % q2

c = solve_crt([c1, c2, c3], [p, q1, q2])
n = q1 * q2
phi = (q1 - 1) * (q2 - 1)
d = gp.invert(7, phi)

flag = gp.iroot(gp.powmod(c, d, n), 2)[0]
print(long_to_bytes(flag))

# b"flag{gcd_e&\xcf\x86_isn't_1}"

还有一个小插曲,\xcf\x86可以通过utf-8编码再次转换成φ,所以最终flag是flag{gcd_e&φ_isn't_1}

参考目录

当中国剩余定理邂逅RSA-安全KER - 安全资讯平台

中国剩余定理 - OI Wiki

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值