题目原型:
1 {6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249,773} 2 {6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249,839} 3 4 message1=3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349 5 message2=5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535
可以看到有两个不同的e和c,并且有相同的n,很明显是rsa的共模攻击
先验证e1,e2是否互质
1 import gmpy2 2 e1 = 773 3 e2 = 839 4 r = gmpy2.gcd(e1, e2) 5 print(r)
得到结果为1,则e1,e2互质
根据共模攻击原理,使得(c1^e1*c2^e2)%n==m
由代码实现便是
1 import gmpy2 2 3 e1=773 4 e2=839 5 6 n=6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249 7 8 c1=3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349#c1 9 c2=5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535#c2 10 11 _,s1,s2=gmpy2.gcdext(e1,e2) 12 m=(pow(c1,s1,n)*pow(c2,s2,n))%n 13 print(gmpy2.gcd(e1,e2)) 14 print(m)
得出m后继续转换,尝试了long_to_bytes转换却得到一行乱码,另外试图将其转换成16进制转换字符也不行,后来转换成ascii码变得到答案
1 m=str(m) 2 flag='' 3 i=0 4 while i<len(m): 5 if m[i]=='1': 6 flag+=chr(int(m[i:i+3])) 7 i+=3 8 else: 9 flag+=chr(int(m[i:i+2])) 10 i+=2 11 print(flag)
最后得到flag:flag{whenwethinkitispossible}
标签:SameMod,BUUCTF,gmpy2,839,c2,c1,e1,e2 From: https://www.cnblogs.com/lgyj/p/16885181.html