[羊城杯 2021]Bigrsa‘共享素数’
题目:
n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073 e = 65537 m = bytes_to_long(flag) c = pow(m, e, n1) c = pow(c, e, n2) print("c = %d" % c) # output # c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
解题:
题目给出两个N,首先利用gcd测试一下,如果存在一个公因数,那么则存在共享素数
import gmpy2 from Crypto.Util.number import * n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073 e = 65537 q = gmpy2.gcd(n1,n2) print(q) # 10210039189276167395636779557271057346691950991057423589319031237857569595284598319093522326723650646963251941930167018746859556383067696079622198265424441 # 由于存在共享素数,那么直接可以算得n1,n2另一个因子 p1 = n1 // q p2 = n2 // q # 下面就是基本操作了,算欧拉,求逆元 d1 = gmpy2.invert(e,(q-1)*(p1-1)) d2 = gmpy2.invert(e,(q-1)*(p2-1)) # 按照题目加密顺序反向解密 c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264 m = pow(c,d2,n2) m = pow(m,d1,n1) print(long_to_bytes(m))
解得:b'SangFor{qSccmm1WrgvIg2Uq_cZhmqNfEGTz2GV8}
RSA脚本大多引用自https://lazzzaro.github.io/2020/05/06/crypto-RSA/