0
点赞
收藏
分享

微信扫一扫

ctf入门RSA共模攻击

Brose 2022-03-23 阅读 65
python安全

RSA共模攻击

一.题目描述

假设有一条信息m,由两个不同的用户使用公钥进行RSA加密(两个用户的e一般不同,模数n一般相同)

c1 = m^e1 mod n
c2 = m^e2 mod n

得到了两个不同的密文c1,c2
因为公钥是公开的(e1,e2,n)已知
那么攻击者一共知道如下信息

gcd(e1, e2) = 1
m = c1^d1 mod n
m = c2^d2 mod n

即通过以上信息求解出明文m

该题目题干为:

#coding:utf-8
import gmpy2
import libnum
e = 548564175098067125961375319851171259385596271876637657761522885808657855394647972481844447376596437557651275057610120865395646169671221375251081541213042646978655686531005856899936162320404991331623237305862913250487293880446994470841390688087392282045130633013139311548859962245908782253213294049851175315059
n = 639662333905190724963174274393118134850652056724765488685973275138948202602626008285649108873241886836533441901790252560580886492518792249844707754890068885294414947775869189660933854702732140888525369256213185908742658834741758334492843871934294115437721034834635565406377520933839418094457376057043593848401

m=“flag{you_need_to_solve}”
m=libnum.s2n(m)
c1=pow(m,e,n)
print(c1)

c1 = 266367266471585923035346980467315672043839080179258966276144775106482166900911004389808367589961536843898187180012055918063504477273067284037318171833017082239907978935274619109926579983150571298634653886980563681026116724117473808890951091279814434050754571460308728024448607359710055618866766919226511213734

二.解题方法

1.解题原理

首先说一下RSA的工作原理,RSA涉及一下几个参数:

  • 要加密的信息为m,加密后的信息为c;
  • 模n,负责计算出两个质数p和q,p和q计算欧拉函数值φ(n);
  • 欧拉函数值φ(n),φ(n)=(p-1)(q-1);
  • 公钥参数e和私钥参数d,可由欧拉函数值计算出,ed≡1 (mod φ(n));
  • 加密:me ≡ c (mod n)
  • 解密:cd ≡ m (mod n)

当n不变的情况下,知道n,e1,e2,c1,c2 可以在不知道d1,d2的情况下,解出m。

首先假设,e1,e2互质

gcd(e1,e2)=1

此时则有

e1*s1+e2*s2 = 1

式中,s1、s2皆为整数,但是一正一负。

通过扩展欧几里德算法,我们可以得到该式子的一组解(s1,s2),假设s1为正数,s2为负数.

因为

c1 = m^e1%n c2 = m^e2%n

所以

(c1^s1*c2^s2)%n = ((m^e1%n)^s1*(m^e2%n)^s2)%n

根据模运算性质,可以化简为

(c1^s1*c2^s2)%n = ((m^e1)^s1*(m^e2)^s2)%n

(c1^s1*c2^s2)%n = (m^(e1^s1+e2^s2))%n

又前面提到

e1*s1+e2*s2 = 1

所以

(c1^s1*c2^s2)%n = (m^(1))%n 
(c1^s1*c2^s2)%n = m^%n

c1^s1*c2^s2 = m

2.解题步骤

利用python脚本辅助进行拓展欧几里得算法并得出flag

python脚本如下:

import gmpy2
import libnum

n= 14091389828039065635933265910333787565031458777330515607885321556451962136948848383321568214409844758925662434880697179266963986711632794441626178527560445158409167323937961678953156651354000380039236871790206463836764401405384470102254946437638049533434183950178210294893931544603001353766780236201462552437323480965714025749795152890563035265291386381868186966161471330043246266036709771377069389008914883166661828783957006679496920633765277432047416926285557876972645849502901589566821077114332083440643626953844807149377986942344243268775668963651289181623052898113135594842198645575875012598700722802771026494551
e1= 2333
c1= 6546280256840639562463959345926022053182407249092817804938368741652635865399391809568128391073731808900641750730184856464005001950111757663623205806674365027992551444696566317485026094754181277266120416130960659230299092027410403876418909107528500885597073135297923673305491023400155287950126799577090155687881846165218224157055672153003591412088439532472066130551864655113372355215042259412231548874254457530569281062045841783889916782457912081312266100416678986810868726777095528315473769962260211569483136979663272137941610846797152012414781373859394013993138025313210541642550627194979822931987198414936576312442
n2= 14091389828039065635933265910333787565031458777330515607885321556451962136948848383321568214409844758925662434880697179266963986711632794441626178527560445158409167323937961678953156651354000380039236871790206463836764401405384470102254946437638049533434183950178210294893931544603001353766780236201462552437323480965714025749795152890563035265291386381868186966161471330043246266036709771377069389008914883166661828783957006679496920633765277432047416926285557876972645849502901589566821077114332083440643626953844807149377986942344243268775668963651289181623052898113135594842198645575875012598700722802771026494551
e2= 65537
c2= 10300756352389104509280930985202458689121568217669730927659822777847618377758549063917686916241237743493516693875586658305918668600360728258515675985097636836649530170371749158821436951346291442190474495948487389820749127719581499011117559664980381933591786058426484358625001878673310671097627784290573866496321678179637790052457588478603014630510127823124410861396463115419252674768014180245125889394914032897546152402048065395395225068275379994156726332695564711278124751584484496321834697807129262340763840054782576154272303647429976652421448357612388940060441163096406709118409558600904731437906045727681898297188

#共模攻击
#共模攻击函数
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)
print(“e1,e2:”,e1,e2)
print(gmpy2.gcd(e1,e2))
s = gmpy2.gcdext(e1, e2)
print(s)
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)

m = rsa_gong_N_def(e1,e2,c1,c2,n)
print(m)
print(libnum.n2s(int(m)).decode())

运行结果如下:
在这里插入图片描述

举报

相关推荐

0 条评论