题目
from secret import flag
m = libnum.s2n(flag)
p = libnum.generate_prime(1024)
q = libnum.generate_prime(200)
a = p**2+q**2
e1=libnum.generate_prime(16)
e2=gmpy2.next_prime(e1)
n=p*q
c1=pow(m,e1,n)
c2=pow(m**3,e2,3*n)
print("a=",a)
print("c1=",c1)
print("c2=",c2)
a= 24206265871435822703437518362958531356211626642007253784650483176562422122875340827288772819943478120095206127359525474074270229930748107117372266160892473927182468441245406239260325825983178681264861898227398697570877226191045205101392758306677352447609463242377314079908674367312467009340725296069934982237938083953835511845988528740319671339681988454341775949773782599028758795858243892505801751373271145879675219676812982346718542627999285987122318375982631166086424677380378329616021990407324172009541237668232705741580914256004477070860164426099061412907214192878993303911745798633464333183684318013108481194330
c1= 126859631077098611901511232008797051138574124478480730639144977155143424488144265276530078952871200528973257851214276765041293928258819231377836450311630167556457808627111669654324359435794012547994299283010757231576308562368663215764193973190892053938581481578656240077555108821408787703658040501252208210069312753866895619962762868562608316860640231777068617867166147
c2= 11826835748339980863398980051042008082750935496082618268555582889298555680769555714450413403033938771160762505072342684767000980792793194857952806136430859946630518327736718530548802427141716474368099142576512330275210929488407696914896855868077026602082934281710567654604010065436992743237842728041335992414634519294554988610297895321490267356849938289132035975812904
#libnum.generate_prime(n):产生长度为n位的伪素数
过程分析
由题目可知,p的位数为1024,q的位数为200。在各自平方之后,p的平方远远大于q的平方,所以a开平方的值可近似看作p,然后(a-p**2)开平方得到q。又因为e1 = libnum.generate_prime(16),是一个长度为16位的伪素数,在这个范围内我们可以对e1进行爆破,找到满足条件的e1,再求Phi和d,最终得到flag。
解题脚本
import gmpy2
from Crypto.Util.number import *
a= 24206265871435822703437518362958531356211626642007253784650483176562422122875340827288772819943478120095206127359525474074270229930748107117372266160892473927182468441245406239260325825983178681264861898227398697570877226191045205101392758306677352447609463242377314079908674367312467009340725296069934982237938083953835511845988528740319671339681988454341775949773782599028758795858243892505801751373271145879675219676812982346718542627999285987122318375982631166086424677380378329616021990407324172009541237668232705741580914256004477070860164426099061412907214192878993303911745798633464333183684318013108481194330
c1= 126859631077098611901511232008797051138574124478480730639144977155143424488144265276530078952871200528973257851214276765041293928258819231377836450311630167556457808627111669654324359435794012547994299283010757231576308562368663215764193973190892053938581481578656240077555108821408787703658040501252208210069312753866895619962762868562608316860640231777068617867166147
c2= 11826835748339980863398980051042008082750935496082618268555582889298555680769555714450413403033938771160762505072342684767000980792793194857952806136430859946630518327736718530548802427141716474368099142576512330275210929488407696914896855868077026602082934281710567654604010065436992743237842728041335992414634519294554988610297895321490267356849938289132035975812904
p = gmpy2.iroot(a,2)[0]
q = gmpy2.iroot(a-p**2,2)[0]
n = p*q
phi = (p-1)*(q-1)
for e in range(2**15,2**16):
if gmpy2.is_prime(e):
try:
d = gmpy2.invert(e,phi)
m = pow(c1,d,n)
flag = long_to_bytes(m)
if b'flag' in flag:
print(flag)
break
except:
pass
flag:
flag{b8082417-0499-41f4-8c26-a1de19c44c42}
【男子年轻时候,总是想着自己有什么,就给女子什么,这没什么不好的。不同的岁月,不同的情爱,各有千秋,没有高下之分,好坏之别。人生无遗憾,太过圆满,事事无错,反而不美,就很难让人年老之后,时时惦念了。】