1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| from Crypto.Util.number import long_to_bytes import math
def gaussian_reduction(v1, v2): if math.sqrt(v1[0]**2 + v1[1]**2) > math.sqrt(v2[0]**2 + v2[1]**2): v1, v2 = v2, v1 while True: m = round((v2[0]*v1[0] + v2[1]*v1[1]) / (v1[0]**2 + v1[1]**2)) if m == 0: break v2 = (v2[0] - m * v1[0], v2[1] - m * v1[1]) v1, v2 = v2, v1 return v1, v2
def decrypt(q, h, f, g, e): a = (f * e) % q try: f_inv = pow(f, -1, g) except: return None m = (a * f_inv) % g return m
with open('output.txt', 'r') as f: data = f.read() lines = data.split('\n') q_h_line = lines[0].split('Public key:')[1].strip() q_h = eval(q_h_line) q, h = q_h e_line = lines[1].split('Encrypted Flag:')[1].strip() e = int(e_line)
v1 = (1, h) v2 = (0, q)
v1_red, v2_red = gaussian_reduction(v1, v2)
if math.sqrt(v1_red[0]**2 + v1_red[1]**2) < math.sqrt(v2_red[0]**2 + v2_red[1]**2): f, g = v1_red else: f, g = v2_red
m = decrypt(q, h, f, g, e) if m is not None: flag = long_to_bytes(m) print("Flag:", flag.decode()) else: print("Decryption failed. Trying alternative vector...") if math.sqrt(v1_red[0]**2 + v1_red[1]**2) < math.sqrt(v2_red[0]**2 + v2_red[1]**2): f, g = v2_red else: f, g = v1_red f = abs(f) g = abs(g) m = decrypt(q, h, f, g, e) if m is not None: flag = long_to_bytes(m) print("Flag:", flag.decode()) else: print("Decryption still failed. Check the lattice reduction.")
|
💬 评论与讨论
分享你的想法和见解