q=sympy.nextprime(p^((1<<512)-1))

题目:

from Crypto.Util.number import *
import sympy
from secrets import flag

def get_happy_prime():
    p = getPrime(512)
    q = sympy.nextprime(p ^ ((1 << 512) - 1))
    return p, q

m = 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,得到一个二进制表示全为1512位数
  • 我们发现qp512位的1进行异或,再进行nextprime得到的结果
  • 先不考虑nextprime带来的差值,我们可以有n=p*p_re(p_re是指p按位异或取反的值),即原码+反码=2^x位数-1
  • 或者把上面那个式子转换一下,q2<sup>512</sup>-p-1的下一个素数,也就是说q2<sup>512</sup>-p-1很接近,也即p+q2<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) + 1
    d = gmpy2.invert(e, phi)
    m = pow(c, d, n)
    t += 2
    if b'XYCTF{' in long_to_bytes(m):
        print(long_to_bytes(m))
        break
#XYCTF{3f22f4efe3bbbc71bbcc999a0a622a1a23303cdc}
posted @ 2025-03-16 19:47  sevensnight  阅读(31)  评论(0)    收藏  举报