e与phi不互素
题目:
from Crypto.Util.number import *
flag = b'NSSCTF{******}'
p = getPrime(512)
q = getPrime(512)
e = 65537*2
n = p*q
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f'p = {p}')
print(f'q = {q}')
print(f'e = {e}')
print(f'c = {c}')
'''
p = 9927950299160071928293508814174740578824022211226572614475267385787727188317224760986347883270504573953862618573051241506246884352854313099453586586022059
q = 9606476151905841036013578452822151891782938033700390347379468858357928877640534612459734825681004415976431665670102068256547092636766287603818164456689343
e = 131074
c = 68145285629092005589126591120307889109483909395989426479108244531402455690717006058397784318664114589567149811644664654952286387794458474073250495807456996723468838094551501146672038892183058042546944692051403972876692350946611736455784779361761930869993818138259781995078436790236277196516800834433299672560
'''
解题思路:
已知e,p,q,c,但是e和phi不互素
我们需要先求出e和phi的最大公约数gcd1=2然后e//gcd1和phi互素,其实是有
c = m^2e mod n = (m2)e mod n
这里的gcd1即是2,因此按正常步骤解出来的m其实是m2即mgcd1,最后需要我们开个根即可
解答:
import gmpy2
import libnum
p = 9927950299160071928293508814174740578824022211226572614475267385787727188317224760986347883270504573953862618573051241506246884352854313099453586586022059
q = 9606476151905841036013578452822151891782938033700390347379468858357928877640534612459734825681004415976431665670102068256547092636766287603818164456689343
e = 131074
c = 68145285629092005589126591120307889109483909395989426479108244531402455690717006058397784318664114589567149811644664654952286387794458474073250495807456996723468838094551501146672038892183058042546944692051403972876692350946611736455784779361761930869993818138259781995078436790236277196516800834433299672560
n = p*q
phi = (p-1)*(q-1)
gcd1 = gmpy2.gcd(e, phi)
t1 = e//gcd1
dt = gmpy2.invert(t1, phi) #计算t1在模phi下的逆元
m_gcd1 = gmpy2.powmod(c, dt, n) #使用模幂运算解密密文,得到一个与原始明文相关的值
m = gmpy2.iroot(m_gcd1, gcd1) #得到元组(mpz(1920535408007397829480400151650246901210634018403879187581),True)
flag = libnum.n2s(int(m[0]))
print(flag)
#NSSCTF{inverse_and_root}