c = 451420045234442273941376910979916645887835448913611695130061067762180161 p = 722243413239346736518453990676052563 q = 777452004761824304315754169245494387 e = 65537
n = p * q phi = (p - 1) * (q - 1)
d = pow(e, -1, phi) m_trunc = pow(c, d, n)
prefix = b"VIDAR{" suffix = b"}" center = 85
# 3. 遍历爆破中间字符的长度 for length inrange(30, 41): print(f"尝试未知长度 k = {length}")
for i inrange(length): L[i, i] = 1 L[i, -1] = 256**i target -= (256**i) * center
L[-2, -2] = 1 L[-2, -1] = -target L[-1, -1] = n
for i inrange(length + 2): L[i, -1] *= n
res = L.BKZ()
for row in res: ifall(-38 <= x <= 38for x in row[:-2]): if row[-2] == 1: flag_middle = "".join(chr(center + j) for j in row[:-2][::-1]) print(f"\nk = {length}") print(f"Flag: {prefix.decode()}{flag_middle}{suffix.decode()}\n") return
elif row[-2] == -1: flag_middle = "".join(chr(center - j) for j in row[:-2][::-1]) print(f"\nk = {length}") print(f"Flag: {prefix.decode()}{flag_middle}{suffix.decode()}\n") return