题目:
from Crypto.Util.number import *
import sympy
from secrets import flagdef get_happy_prime():p = getPrime(512)q = sympy.nextprime(p ^ ((1 << 512) - 1))return p, qm = bytes_to_long(flag)
p, q = get_happy_prime()
n = p * q
e = 65537
print(n)
print(pow(m, e, n))
# 24852206647750545040640868093921252282805229864862413863025873203291042799096787789288461426555716785288286492530194901130042940279109598071958012303179823645151637759103558737126271435636657767272703908384802528366090871653024192321398785017073393201385586868836278447340624427705360349350604325533927890879
# 14767985399473111932544176852718061186100743117407141435994374261886396781040934632110608219482140465671269958180849886097491653105939368395716596413352563005027867546585191103214650790884720729601171517615620202183534021987618146862260558624458833387692782722514796407503120297235224234298891794056695442287
解题思路:
(1<<512)-1
表示将1
左移512
位,即得到一个只有第513
位为1
的数,其他位都为0
的数;减去1
,得到一个二进制表示全为1
的512
位数
- 我们发现
q
是p
与512
位的1
进行异或,再进行nextprime
得到的结果
- 先不考虑
nextprime
带来的差值,我们可以有n=p*p_re
(p_re是指p按位异或取反的值),即原码+反码=2^x位数-1
- 或者把上面那个式子转换一下,
q
是2<sup>512</sup>-p-1
的下一个素数,也就是说q
与2<sup>512</sup>-p-1
很接近,也即p+q
与2<sup>512</sup>
接近
- 又因为素数性质,
p+q=2**512-1+t
,t
爆破一下
题目:
import gmpy2
from Crypto.Util.number import *n = 24852206647750545040640868093921252282805229864862413863025873203291042799096787789288461426555716785288286492530194901130042940279109598071958012303179823645151637759103558737126271435636657767272703908384802528366090871653024192321398785017073393201385586868836278447340624427705360349350604325533927890879
c = 14767985399473111932544176852718061186100743117407141435994374261886396781040934632110608219482140465671269958180849886097491653105939368395716596413352563005027867546585191103214650790884720729601171517615620202183534021987618146862260558624458833387692782722514796407503120297235224234298891794056695442287
e = 65537
t = 1
#因为q是p的取反后取比其值大的最近的一个素数,所以p + q = 2**512 - 1 + t
for i in range(300):phi = n - (2**512 - 1 + t) + 1d = gmpy2.invert(e, phi)m = pow(c, d, n)t += 2if b'XYCTF{' in long_to_bytes(m):print(long_to_bytes(m))break
#XYCTF{3f22f4efe3bbbc71bbcc999a0a622a1a23303cdc}