[山海关crypto 训练营 day13]

文章提供了一个RSA加密的解题案例,详细解释了解密过程,包括使用模数n、公钥e、加密后的c值,以及如何通过gmpy2库找到原始消息m。解题策略是利用模多项式和小根定理来求解密文。

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

日常鼓励自己:趁年轻去努力,别对不起你儿时吹的牛逼。

[红明谷CTF 2022]easy_ya

题目代码和数据

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
'''

解题思路

考虑m=M+k∗rm=M+k*rm=M+kr
则有
c≡(M+kr)3 (mod n)c \equiv (M+kr)^3\ (mod\ n)c(M+kr)3 (mod n)
考虑构造模多项式
f=(M+kr)3−c (mod n)f=(M+kr)^3-c\ (mod\ n)f=(M+kr)3c (mod n)
求解小根得到答案
代码如下

from Crypto.Util.number import *
import os
from gmpy2 import *

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

c2 = powmod(M, 3, n)

a = int((c - c2)*invert(r, n)%n)
PR.<x> = PolynomialRing(Zmod(n))
f = x^3*r^2 + 3*x^2*r*M + 3*x*M^2 - a
f = f.monic()
roots = f.small_roots()

m = M+roots[0]*r
print(long_to_bytes(m))
#flag{53a2e494-964d-4506-a2c4-c34b9475dedd}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值