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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| import random import math import sympy from Crypto.Util.number import * def know_ed_factor(n,ed): """ :param n: 待分解的模数n :param ed: 公钥指数和私钥指数的乘积ed :return: (p,n//p)直接返回分解的两个素数 """ r = ed - 1 r_list = []
while r % 2 == 0: r = r // 2 r_list.append(r)
while True: g = random.randint(1,n) for i in r_list: t = pow(g,i,n) p = math.gcd(t - 1,n) if p != 1 and p != n: return (p,n//p)
def solve_2_th_root(a,b,c): """ 解一元二次方程: ax^2 + bx + c = 0 :param a 二次项系数a :param b 一次项系数b :param c 常数项c :return: (x1,x2) x1,x2都是取整后的结果 """ delta = b**2 - 4*a*c if delta < 0: print("方程无实数解") return None
elif delta == 0: x = (-1*b)//2*a return (x,x)
elif delta > 0: sqrt_delta = math.isqrt(delta) x1 = int((-1*b + sqrt_delta)//2*a) x2 = int((-1*b - sqrt_delta)//2*a) return (x1,x2)
def know_phi_factor(n,phi): """ 已知phi分解n,仅限两个素数,n=pq 参数n: 传入的是已知的n 参数phi: 传入的是已知的phi :return: (p,q) """ a = 1 b = phi - n -1 c = n p,q = solve_2_th_root(a,b,c)
if p*q == n: print("正确分解出来p,q") return (p,q) else: print("分解不正确") return False
P_n = P_F_n = Q_n = Q_E_D = Ciphertext = e = 65537
p1,q1 = know_phi_factor(P_n,P_F_n) if p1 > q1: p1,q1 = q1,p1
factor2 = 2021 * p1 + 2020 * q1
p = sympy.nextprime(factor2)
p2,q2 = know_ed_factor(Q_n,Q_E_D) if p2 > q2: p2,q2 = q2,p2 factor3 = 2021 * p2 - 2020 * q2 if factor3 < 0: factor3 = (-1) * factor3
q = sympy.nextprime(factor3)
n = p*q phi = (p-1)*(q-1) d = inverse(e,phi) m = pow(Ciphertext,d,n) flag = long_to_bytes(m) print(flag)
|