标题简述:内容是第一遍学,不扎实,遇到一些题目还是无法下手或者有思路有误等等
ctfshow
1.funnyrsa1
e1 = 14606334023791426 p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859 q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593 c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248 e2 = 13813369129257838 p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859 q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649 c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919
解题思路:
题目很简洁只给了6个数,两个e,先想到共模攻击,再看是同一个p,两个q,那么就是两个不同的n,继而加密出来两个不同的c,这个就是题目的所有的信息。
q不同那么phi也不相同,
phi1 = (p - 1) * (q1 - 1) phi2 = (p - 1) * (q2 - 1)
e与phi互质才有逆元的存在,算phi
b = gmpy2.gcd(e1, phi1) print(b) c=gmpy2.gcd(e2, phi2) print(c)
b和c都是14不等于1
那么确定就是e和phi不互素的解法
当e和phi不互素时那么不能直接通过求逆元来求d
首先整除他们的公约数,得到a1,a2
a1 = e1 // b a2 = e2 // b
让a1,a2代替e1,e2作为e,来求得逆元bd1,bd2
bd1 = gmpy2.invert(a1, phi1) bd2 = gmpy2.invert(a2, phi2)
然后恢复“明文”mb1,mb2
mb1 = pow(c1, bd1, n1) mb2 = pow(c2, bd2, n2)
恢复密文
c3 = mb1 * mb2 % p c2 = mb2 % q2 c1 = mb1 % q1
在 sympy 库中,使用sympy.ntheory.modular.crt
函数来求解中国剩余定理
res = solve_crt([c1, c2, c3], [q1, q2, p]) #第一个参数是模数 #第二个参数是余数 #crt中国同余定理,求出特解作为 print(res) #res=686276366723148236482261352811322185229606635041444116204238123219132362642193446339408128130717225928932713874016378861772677430548525116379244595084971679623001446871960786008920808741266727173234576046912427896404118459112118815204008961273960754486733669643329358928359324659176156072595687715539239978844391629037260605552837041167890767310898597759017251514317765773752496873768851748301528762446496808815645225366560401669547030136242593865412547871590894437501516865240551749160895831293123175810915150225579027777474090592597758106846864243993566600833336026317879324897196482940351874950685839362636839659125484149301069930117717892801824125880888936963139562394707935355543305842748452606890836941360580719600326876487729414995085057078810521017811672163109711286568106750470418628876396380781844525662221587626268197130232222757980308556743591873541351938086355187852682391363094625519551602386843425568793007516 n = q1 * q2 f = (q1 - 1) * (q2 - 1) m = res % n#对中间结果进行适当的范围限制和转换 d2 = gmpy2.invert(7, f) m = pow(m, d2, n) msg = gmpy2.iroot(m, 2)[0] print(msg) print(long_to_bytes(int(msg))) #算出的flag还要将\xcf\x86转化为φ
下面是具体的代码实现:
# e1 = 14606334023791426
# p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
# q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
# c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248
#
# e2 = 13813369129257838
# p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
# q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649
# c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919
from symtable import Symbol
import gmpy2
import sympy
from Cryptodome.Util.number import long_to_bytes
from libnum import solve_crt
from sympy import symbols
e1 = 14606334023791426
p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248
e2 = 13813369129257838
p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649
c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919
n1=p1*q1
n2=p2*q2
p=p1
phi1 = (p - 1) * (q1 - 1)
phi2 = (p - 1) * (q2 - 1)
b = gmpy2.gcd(e1, phi1)
print(b)#b=14不符合常理,e和phi不互质
c=gmpy2.gcd(e2, phi2)
print(c)
a1 = e1 // b
a2 = e2 // b#相当于e得角色
bd1 = gmpy2.invert(a1, phi1)#相当于d的角色
bd2 = gmpy2.invert(a2, phi2)
mb1 = pow(c1, bd1, n1)#求出两个m
mb2 = pow(c2, bd2, n2)
c3 = mb1 * mb2 % p
c2 = mb2 % q2
c1 = mb1 % q1
res = solve_crt([c1, c2, c3], [q1, q2, p]) #crt中国同余定理,求出特解作为 print(res)
n = q1 * q2
f = (q1 - 1) * (q2 - 1)
m = res % n
d2 = gmpy2.invert(7, f)
m = pow(m, d2, n)
msg = gmpy2.iroot(m, 2)[0]
print(msg)
print(long_to_bytes(int(msg))) #算出的flag还要将\xcf\x86转化为φ。