BUUCTF SameMod

题目原型:

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}

posted @ 2022-11-13 14:20  lslgru  阅读(500)  评论(0)    收藏  举报