OVO
化简得
k = e // 2 - 2
两边同乘p
只有p未知,这个方程求解之后得到p的高位,用高位泄露的思路求解即可
from Crypto.Util.number import *
def partial_p(p0, n, bits):
PR.<x> = PolynomialRing(Zmod(n))
f = p0 + x
f = f.monic()
roots = f.small_roots(X=2^(bits+5), beta=0.3)
if roots:
x0 = roots[0]
p = gcd(p0 + x0, n)
return ZZ(p)
def find_p(eh, n, bits):
PR.<x> = PolynomialRing(RealField(1000))
f = (kk+rr)*x**2 + (rr*(n+1)+65538)*x + rr*n - eh*x
results = f.roots()
if results:
for x in results:
p_high = int(x[0]) >> 4 << 4
p= partial_p(p_high, n,bits)
if p and p != 1:
return p
n =
e =
c =
rr= e // n
kk = rr - 2
p= find_p(e, n, 200)
q= n // p
e = 65537 + kk * p + rr * ((p + 1) * (q + 1)) + 1
d1 = inverse(e,(p - 1) * (q - 1))
m1 = pow(c,int(d1),n)
print(long_to_bytes(int(m1)))
古典密码
1:首先由atbash cipher解密AnU7NnR4NassOGp3BDJgAGonMaJayTwrBqZ3ODMoMWxgMnFdNqtdMTM9得到:
ZmF7MmI4MzhhLTk3YWQtZTlmNzQzbGdiYjA3LWNlNDctNmUwMjgwNGN9
2:再用base64解密ZmF7MmI4MzhhLTk3YWQtZTlmNzQzbGdiYjA3LWNlNDctNmUwMjgwNGN9
得到:fa{2b838a-97ad-e9f743lgbb07-ce47-6e02804c}
3:用rail fence cipher encode 解密得到flag{b2bb0873-8cae-4977-a6de-0e298f0744c3}