window.onload=function(){ /*页面加载完成之后生成博客目录*/ BlogDirectory.createBlogDirectory("cnblogs_post_body","h2","h3",20); }

[红明谷CTF 2022]easy_ya

题目分数:336

题目评分:5

题目标签: CryptoRSACopperSmith

题目描述:

a very easy crypto challenge.
该题目复现环境尚未取得主办方及出题人相关授权,如果侵权,请联系管理员删除。得到的flag请使用NSSCTF{}格式提交。

附件脚本:

from Crypto.Util.number import *
import os

from flag import flag
def gen():
    e = 3
    while True:
        try:
            p = getPrime(512)
            q = getPrime(512)
            n = p*q
            phi = (p-1)*(q-1)
            d = inverse(e,phi)
            return p,q,d,n,e
        except:
            continue
    return
p,q,d,n,e = gen()
r = getPrime(512)
m = bytes_to_long(flag+os.urandom(32))
M = m%r
c = pow(m,e,n)
print("r = %d"%r)
print("M = %d"%M)
print("n = %d"%n)
print("e = %d"%e)
print("c = %d"%c)
'''
r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473
M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558
n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287
e = 3
c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282
'''

解题步骤:

这种类似于已知部分明文
用sage解

r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473
M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558
n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287
e = 3
c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282

PR.<x> = PolynomialRing(Zmod(n))
m0 = x*r + M
f = (m0^3) - c
f = f.monic()
x0 = f.small_roots(X=2^100,beta=1)[0]
print(x0)
m=M+x0*r
print(m)

其中100是尝试出来的,虽然理论上来说是在0-2kbits范围内求解,但是kbits还是太大太小都不行

另外,注意f.monic()一定要记得赋值给f

得到m后进行解码:

from Crypto.Util.number import long_to_bytes

m=6485097232194198437755667993910287898649267551843383452848230535806020694959067046832721252854563061586676627325202840257402325662599788040642551541918619720183975021007170350613
print(long_to_bytes(m))
flag{53a2e494-964d-4506-a2c4-c34b9475dedd}

 

posted @ 2023-04-15 16:21  Kicky_Mu  阅读(149)  评论(0编辑  收藏  举报