2024网络与信息安全管理员职工职业技能竞赛crypto2

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

flag = bytes_to_long(flag)

flag = flag ^ flag<<32 & 83746827

p = getPrime(1024)
q = sympy.nextprime(p ^ ((1<<1024)-1))
n = p*q
e = 65537

print("n:{}".format(n))
print("c:{}".format(pow(flag, e, n)))


# n:5301397598972247313288332496850350716475485201818176955980458785089381574707191944210831459471919268438547016348517878358341850949122832113070247666993006831115364157417862077449453871831496138911957539167293062864005991063696506379253018606534889826983926875281844458278449190215690887758990065486680816431850022695167802229820332079535914813299959461500637336404925209325721343283089517761175011779007681851011863336544965183375219315895402677151071508014559155505903769839446062037040053310622160951350294055710901827003095846137713980848067052032823563903878691757143326022681734259282855347145001850989000828133
# c:1079288169014101061321928206355744925300551220969419075641876262832726487371819994124377608732112547670099114798464745107564003379099865464351619430318916570130366696160364613680416188212506373427854192842804149927749326167345000668560759743411422188762280329222458147559243918808548354718982167094307668515490808028452844301339928770240602408940910104884669929203404701141421299411411547161351395152357207772777307588700851461027931764790951229634521962317240153809080025163705506953575215528712852173457740427501614871042355672720961319392637949157078224852976478262095339770667897824328595526557318622869976192919

可以判断p+q的大致范围,爆破x获得p+q的值,即可分解n。 

n=5301397598972247313288332496850350716475485201818176955980458785089381574707191944210831459471919268438547016348517878358341850949122832113070247666993006831115364157417862077449453871831496138911957539167293062864005991063696506379253018606534889826983926875281844458278449190215690887758990065486680816431850022695167802229820332079535914813299959461500637336404925209325721343283089517761175011779007681851011863336544965183375219315895402677151071508014559155505903769839446062037040053310622160951350294055710901827003095846137713980848067052032823563903878691757143326022681734259282855347145001850989000828133
c=1079288169014101061321928206355744925300551220969419075641876262832726487371819994124377608732112547670099114798464745107564003379099865464351619430318916570130366696160364613680416188212506373427854192842804149927749326167345000668560759743411422188762280329222458147559243918808548354718982167094307668515490808028452844301339928770240602408940910104884669929203404701141421299411411547161351395152357207772777307588700851461027931764790951229634521962317240153809080025163705506953575215528712852173457740427501614871042355672720961319392637949157078224852976478262095339770667897824328595526557318622869976192919

# import gmpy2
# for x in range(1,300000):
#     p_q=((1<<1023)+(1<<1023)-1+x)**2-4*n
#     if gmpy2.iroot(p_q,2)[1]:
#         print(gmpy2.iroot(p_q,2)[0],x)
        # x=219
p_q=105410700004420889186496259108749251920778765617415681990211998361600730553646403796503457355311462431935327320062632134535853204714359072475912190141393504439441517749299432170039459868994968125729957675160790584921715698316154839968439048762174263674743854488357011762992177170884379894249536884701702270268
print(p_q.bit_length())
x=219
pplusq=2**1023+(1<<1023)-1+x

q=(pplusq+p_q)//2
p=n//q
assert p*q==n
print(p,q)

p=37179306740905350793217129985076610720509466138407487641609041398065972625927279668102509983548036794592393279904380611561468282050028775008467620249040309969163187837783026553131379866125562996861562638462107591958217492013154020752737030889326486744303328098114643238477534383797668205292909722461260933583
q=142590006745326239979713389093825862641288231755823169631821039759666703179573683464605967338859499226527720599967012746097321486764387847484379810390433814408604705587082458723170839735120531122591520313622898176879933190329308860721176079651500750419047182586471655001469711554682048099542446607162963203851

phi=(p-1)*(q-1)
d=inverse(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m),m.bit_length())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值