已知m低位(可以看作短填充)

题目:

from Crypto.Util.number import *
from secret import flag
p = getPrime(512)
q = getPrime(512)
assert GCD(3, (p-1)*(q-1)) != 1
assert len(flag) == 40
assert flag.startswith(b'flag{')
assert flag.endswith(b'}')
n = p*q
m = bytes_to_long(flag[7:-1]+b'12345678900987654321')
e = 3
c = pow(m, e, n)
 
print("n =", n)
print("m =", m&((1<<350)-1))
print("c =", c)
 
'''
n = 78143938921360185614860462235112355256968995028076215097413461371745388165946555700961349927305255136527151965763804585057604387898421720879593387223895933656350645970498558271551701970896688207206809537892771605339961799334047604053282371439410751334173463317244016213693285842193635136764938802757014669091
m = 1906077032611187208365446696459387107800629785754941498024021333398862239730761050657886407994645536780849
c = 50130000135496687335562420162077023127865865388254124043997590968769445787929013990729805222613912997653046528125102370938788632651827553831996692788561639714991297669155839231144254658035090111092408296896778962224040765239997700906745359526477039359317216610131441370663885646599680838617778727787254679678
'''

解题思路:

  • f.small_roots中参数beta,epsilon参数的选取相对固定,上面的组合可以解决绝大多数的问题
  • x的选取主要看fx的取值范围,我们要求的是small_roots最小根,就要封一个上限
  • 这里明文有32位加20位填充字节共516位,减去已知的350位,共66位,上限就定在了67

解答:

n = 78143938921360185614860462235112355256968995028076215097413461371745388165946555700961349927305255136527151965763804585057604387898421720879593387223895933656350645970498558271551701970896688207206809537892771605339961799334047604053282371439410751334173463317244016213693285842193635136764938802757014669091
m = 1906077032611187208365446696459387107800629785754941498024021333398862239730761050657886407994645536780849
c = 50130000135496687335562420162077023127865865388254124043997590968769445787929013990729805222613912997653046528125102370938788632651827553831996692788561639714991297669155839231144254658035090111092408296896778962224040765239997700906745359526477039359317216610131441370663885646599680838617778727787254679678
e = 3

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

f=(2^350*x+m)^3-c
f=f.monic()
x0=f.small_roots(X=2^67,beta=0.4,epsilon=5/32)[0]
m0=2^350*x0+m

print(bytes.fromhex(hex(m0)[2:]))
#739a9a9e50c9a8a5ba83ae2a8e75947012345678900987654321
posted @ 2025-03-11 22:05  sevensnight  阅读(16)  评论(0)    收藏  举报