HIT-CTF-RSA001

        首先,打开网页,可以看见题目是一个python文件,下载并打开查看:

        初步分析,得出是一个关于RSA的题目。查看相关条件,可以发现两个重要信息:

        如下展示,

n = p * q

hint = 3*p + 2*q

# n = 17918079706161007895622844669304802063151695517690927900630994397071693440782390581645793203996211647338814654829571782036132457651781282496574577404081423361473277011371823441347990815437621195994970899876166235097252632003428818683986131655912150264150559692859752550655908121776108384776871387610490928020306396747921176545775339837718933646359068135466991087077802838170597325746924140236226081499269898476481922682387807755601504747007811056039869086959374815287149323087784829918751769557009490467343607283563127840637466239689099538678064957074726781557583465827676275424881056751176672024104656322250184012977
# c = 6500922327729767082068740435446164717447128097913423368185828741019789228052708043753228222408205689618835116815987084129693992286843291730950265403831125123210956448637235123598735840818089289277873917021800838889522950009532138747360328583636431106720085836060728679140030126456409994450186017232418009591437825538217774331309433759951472663124396985915337355161708130370230366738673198155231387741548268738211204721607041480190955512314492682988505614273617879309439429222934760730670862206304973609787347025187818450491763116823269590622523079628590270991836057435071443013534185796433005133011187572949670583436
# hint = 684876483034382864300930177825692952761271025694766174530399650057291066975587250791469172803179786121136422890477887174755136149952519112116194261596405931261242214663918236400980304528296356718003234051461452836121324981751608338928280512986206310081280814723639876935646904811836997952118775571540509872203

        接下来,开始分析求解。

n = p \times q

hint = 3 \times p + 2 \times q

\therefore \left ( 3 \times p + 2 \times q \right ) ^{2} - 24 \times p \times q = \left ( 3 \times p - 2 \times q \right ) ^{2}

\therefore \left ( 3 \times p - 2 \times q \right ) ^{2} = hint ^ {2} - 24 \times n

\therefore \left ( 3 \times p - 2 \times q \right ) = \sqrt{hint ^ {2} - 24 \times n}

        开始编写代码:

'''
Author: LeopardRich 2829176648@qq.com
Date: 2023-11-25 22:08:41
FilePath: \Temp\CTF_personal\RSA_1\exp01.py
Description: HIT-网络空间安全设计与实践
Copyright (c) 2023 by LeopardRich 2829176648@qq.com, All Rights Reserved. 
'''
from Crypto.Util.number import inverse
import gmpy2

n = 17918079706161007895622844669304802063151695517690927900630994397071693440782390581645793203996211647338814654829571782036132457651781282496574577404081423361473277011371823441347990815437621195994970899876166235097252632003428818683986131655912150264150559692859752550655908121776108384776871387610490928020306396747921176545775339837718933646359068135466991087077802838170597325746924140236226081499269898476481922682387807755601504747007811056039869086959374815287149323087784829918751769557009490467343607283563127840637466239689099538678064957074726781557583465827676275424881056751176672024104656322250184012977
hint = 684876483034382864300930177825692952761271025694766174530399650057291066975587250791469172803179786121136422890477887174755136149952519112116194261596405931261242214663918236400980304528296356718003234051461452836121324981751608338928280512986206310081280814723639876935646904811836997952118775571540509872203
c = 6500922327729767082068740435446164717447128097913423368185828741019789228052708043753228222408205689618835116815987084129693992286843291730950265403831125123210956448637235123598735840818089289277873917021800838889522950009532138747360328583636431106720085836060728679140030126456409994450186017232418009591437825538217774331309433759951472663124396985915337355161708130370230366738673198155231387741548268738211204721607041480190955512314492682988505614273617879309439429222934760730670862206304973609787347025187818450491763116823269590622523079628590270991836057435071443013534185796433005133011187572949670583436

# 计算 (3*p -2*q)*(3*p -2*q)
large_number = hint*hint - 24*n  

# 计算 (3*p -2*q)
large_number_gmp = gmpy2.mpz(large_number)
sqrt_result = gmpy2.isqrt(large_number_gmp)  # 可以计算较大数字的平方根

print('[计算的(3*p -2*q)]', sqrt_result)

assert sqrt_result * sqrt_result == large_number  # 设置断言,判断是否求解有误差

p = (hint + sqrt_result) // 6  # p = ((3*p + 2*q) + (3*p - 2*q)) // 6
q = (hint - sqrt_result) // 4  # q = ((3*p + 2*q) - (3*p - 2*q)) // 4
e = 0x10001  # 公钥指数

print("[计算的p]", p)
print("[计算的q]", q)

# 计算模数 n
assert n == p * q  # 设置断言,判断是否求解错误

# 计算欧拉函数 phi(n)
phi_n = (p - 1) * (q - 1)

# 计算私钥指数 d
d = inverse(e, phi_n)

print(f"私钥指数 d = {d}")

# 解密操作
m = pow(c, d, n)
print(f"明文 m = {m}")
big_integer = int(m)

# 将大整数转换为字节类型
bytes_representation = big_integer.to_bytes(
    (big_integer.bit_length() + 7) // 8, 'big')

# 打印结果
print(bytes_representation)

        输出结果如下:

[计算的(3*p -2*q)] 197539575947912599193023072012275205175526433795730545910935735236681827452638168096669688901880241488421354690270651590906429668410051428593758001727515072065457170253485820430683787680670563526113922926083761313685146094017230210933922407512361783383818195446084645088377423951016635344820676934288312148431
[计算的p] 147069343163715910582325541639661359656132909915082786740222564215662149071370903148023143617510004601592962930124756460943594303060428423451658710553986833887783230819567342805277348701494486707352859496257535691634411845961473091643700486749761348910849835028287420337337388127142272216156575417638137003439 
[计算的q] 121834226771617566276976776453354436896436147974758907154865978705152309880737270673699870975324886158178767050051808895962176620385616920880609064967222714798946261102608103992574129211906448297972327781344422880609044721933594531998589526368461131674365654819388807961817370215205090651824524659313049430943 
私钥指数 d = 14584191003032586846761514918209958595216456261351407098331616249187410824597632799742611759475867340647182357028454881504393147207210719932477496413719202379893327671660393027325417307290370744128656067749429108424138229533834375620792410713357673246266739486034114779584633213908219014742094548565030708963987671065097560566171600613537472509608741326200434564910592926919284792764939928535771199444435397052542408247464093615417650019840018132652067942628531208573266934004716439931919133575613945923836131931244741936370930282474160313162844543318610997249935531725607557773892883959018292541848098948578427877917
明文 m = 164587995846526311654585212145887861155468750242343948100256125
b'flag{ez_Ez_eZ_checkin_RsA}'

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值