有人发了一道题,看起来很简单,但我当时确实没做出来,在此记录一下
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
'''
先上exp:
n = 78143938921360185614860462235112355256968995028076215097413461371745388165946555700961349927305255136527151965763804585057604387898421720879593387223895933656350645970498558271551701970896688207206809537892771605339961799334047604053282371439410751334173463317244016213693285842193635136764938802757014669091
m = 1906077032611187208365446696459387107800629785754941498024021333398862239730761050657886407994645536780849
c = 50130000135496687335562420162077023127865865388254124043997590968769445787929013990729805222613912997653046528125102370938788632651827553831996692788561639714991297669155839231144254658035090111092408296896778962224040765239997700906745359526477039359317216610131441370663885646599680838617778727787254679678
e=3
from Crypto.Util.number import *
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
long_to_bytes(int(m0))
一开始想到了coppersmith 攻击,但是在 f=(2^350*x+m)^3-c 这里,并没有给x系数2^350,导致没有求出来,吃一堑长一智,合理的提高效率的方法要牢记。
篇幅太短发不出去。。那就多唠两句
在f.small_roots中参数beta、epsilon参数的选取相对固定,上面的组合可以解决绝大多数的问题,x的选取主要看f中x 的取值范围,我们要求的是small_roots,最小根,就要封一个上限,这里明文flag32位加20位填充字节,共二进制516位,减去已知的350位 共66位,上限就定在了67。