[山海关crypto 训练营 day18]

文章描述了一次CTF比赛中的解题挑战,涉及到RSA加密算法。题目提供了部分信息,包括高位数(h)、公钥(e=65537)和加密后的消息(c)。解题者使用Sage脚本找出大素数p,然后通过n/p计算出q,进一步求得欧拉函数phi和私钥d,最终解密得到原始flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[HNCTF 2022 WEEK3]partialP

题目代码和相关数据

from Crypto.Util.number import *
import uuid

p = getPrime(512)
q = getPrime(512)
n = p*q
e=65537
flag = "flag{"+str(uuid.uuid4())[:20]+"}"
m = bytes_to_long(flag.encode())
assert(m<n)
c=pow(m,e,n)

print(f"h = {((p>>128)<<128)}")
print(f"e = 65537")
print(f"c = {c}")
print(f"n = {n}")
"""
h = 9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576240573278202121547956666293242671661056
e = 65537
c = 2226099021169425534206121605501718994593261953280046899345810118356590881389142531649792348146129153474985003929407172972982275439970723778495455838452638879586163957468972518078320159354264971816842073874550773309020013613432004074760802192607651584906352686468143648939740004838208640531785439362344039075       
n = 96928253979490973984593903132811649229014718994486532280648145898877952846656019305217095845257550421730063527538581223570539203247068060192535543753763017716750817560470547219370972835770943358384150269303529653434434525449357699107332781898776312692702549420939758722366794431784782973884379040574148608179      
"""

解题思路

简简单单的泄露高位攻击,拿出sage脚本进行恢复

ph=9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576240573278202121547956666293242671661056
n=96928253979490973984593903132811649229014718994486532280648145898877952846656019305217095845257550421730063527538581223570539203247068060192535543753763017716750817560470547219370972835770943358384150269303529653434434525449357699107332781898776312692702549420939758722366794431784782973884379040574148608179

PR.<x> = PolynomialRing(Zmod(n))

f=ph+x

x0=f.small_roots(X=2^128,beta=0.4)[0]

print(x0)
print(ph+x0)


#261740504650798819122094793963860669611
#9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576502313782852920367078761087206532330667

恢复p之后,按照正常RSA求解,代码如下

import gmpy2
import binascii

n = 96928253979490973984593903132811649229014718994486532280648145898877952846656019305217095845257550421730063527538581223570539203247068060192535543753763017716750817560470547219370972835770943358384150269303529653434434525449357699107332781898776312692702549420939758722366794431784782973884379040574148608179
p = 9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576502313782852920367078761087206532330667
q = n//p
phi = (p-1)*(q-1)
e=65537
c = 2226099021169425534206121605501718994593261953280046899345810118356590881389142531649792348146129153474985003929407172972982275439970723778495455838452638879586163957468972518078320159354264971816842073874550773309020013613432004074760802192607651584906352686468143648939740004838208640531785439362344039075
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(binascii.unhexlify(hex(m)[2:]))

#b'flag{c014bbe0-d90b-4249-b}'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值