题目如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import gmpy2from gmpy2 import *from Crypto.Util.number import *flag = '***************' p = getPrime(512 ) q = getPrime(512 ) m1 = bytes_to_long(bytes (flag.encode())) n = p*q e1 = getPrime(32 ) e2 = getPrime(32 ) print ()flag1 = pow (m1,e1,n) flag2 = pow (m1,e2,n) print ('flag1= ' +str (flag1))print ('flag2= ' +str (flag2))print ('e1= ' +str (e1))print ('e2= ' +str (e2))print ('n= ' +str (n))flag1=100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280 flag2=86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075 e1=3247473589 e2=3698409173 n=103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
从题目中可以发现有两个不同的密文和指数e,而明文m1和模数n相同,这是典型的共模攻击。博主首先尝试分解n,发现不行,那就使用共模攻击的脚本来解即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import gmpy2from gmpy2 import *from Crypto.Util.number import *flag1=100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280 flag2=86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075 e1= 3247473589 e2= 3698409173 n=103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313 def rsa_gong_N (e1,e2,c1,c2,n ): e1,e2,c1,c2,n = int (e1), int (e2), int (c1), int (c2),int (n) s = gcdext(e1,e2) t = s[1 ] z = s[2 ] if t < 0 : t = -t c1 = inverse(c1,n) elif z < 0 : z = -z c2 = inverse(c2,n) m = (pow (c1,t,n)*pow (c2,z,n)) % n return m result = rsa_gong_N(e1,e2,flag1,flag2,n) print (long_to_bytes(result).decode())
数学证明如下: