BUAA^AITMCLAB&Level5题解

Level5

  • 分析加密过程:

    • flag被分为两部分

      flag = "********************"
      flag1 = flag[:19].encode()
      flag2 = flag[19:].encode()
      assert (len(flag) == 38)
      
    • 素因子的数据范围:

      可以发现P1与P2/Q1与Q2/E1与E2都是是相邻最近的两素数

      P1 = getPrime(1038)
      P2 = nextprime(P1)
      assert (P2 - P1 < 1000)
      Q1 = getPrime(512)
      Q2 = nextprime(Q1)
      E1 = getPrime(1024)
      E2 = nextprime(E1)
      
    • 特殊形式的N:

      N1 = P1 * P1 * Q1
      N2 = P2 * P2 * Q2
      
    • 两段flag分别加密后得到两组 < N , E , c > <N,E,c>

  • 解密实现

    • Extension of wiener’s attack:

      • 一个实际应用很难实现的数学理论:

  • 但本题N的素因子形式特殊 N = p 2 q N=p^2q N=p2q),则有以下连分数理论
    ( e 1 ,   e 2 ) 已 知 , N 1 = p 1 2 q 1 ,   N 2 = p 2 2 q 2 p 1 , p 2 是 相 邻 质 数 , p 1 < p 2 , p 1 p 2 < 1 q 1 , q 2 是 相 邻 质 数 , q 1 < q 2 , q 1 q 2 < 1 故 , N 1 < N 2 , N 1 N 2 = ( p 1 p 2 ) 2 q 1 q 2 < 1 有 q 1 q 2 ∈ ( N 1 N 2 , 1 ) , q 1 < q 2 < p 1 < p 2 ∣ N 1 N 2 − q 1 q 2 ∣ = ∣ q 1 q 2 ( p 1 2 − p 2 2 ) p 2 2 q 2 2 ∣ < 1 2 q 2 2 原 因 : ∣ p 1 2 − p 2 2 ∣ < p 2 2 2 q 1 q 2 (e_1,~e_2)已知, N_1=p_1^2q_1,~N_2=p_2^2q_2\\ p_1,p_2是相邻质数,p_1(e1, e2)N1=p12q1, N2=p22q2p1,p2p1<p2,p2p1<1q1,q2q1<q2,q2q1<1N1<N2,N2N1=(p2p1)2q2q1<1q2q1(N2N1,1),q1<q2<p1<p2N2N1q2q1=p22q22q1q2(p12p22)<2q221p12p22<2q1q2p22

    q 1 q 2 \frac{q_1}{q_2} q2q1 N 1 N 2 \frac{N_1}{N_2} N2N1收敛分数

  • 攻击代码实现:

    def wiener_attack_2(n1, n2):
        for (q2, q1) in cal_fra(n1, n2):
            if q1 == 0:
                continue
            if n1 % q1 == 0 and q1 != 1:
                return q1
        raise ValueError("ubsolvable!")
    
  • 解密主流程:

    q1 = wiener_attack_2(N1, N2)
    p1 = iroot(N1//q1, 2)[0]
    phi1 = p1*(p1-1)*(q1-1)
    d1 = invmod(E1, phi1)
    m1 = rsa_decrypt(c1, (N1, d1))
    

    第二组可以由代数计算得到,也可以利用相邻质数的性质进行如下操作:

    q2 = nextprime(q1)
    p2 = nextprime(p1)
    phi2 = p2*(p2-1)*(q2-1)
    d2 = invmod(E2, phi2)
    m2 = rsa_decrypt(c2, (N2, d2))
    print(n2s(m1)+n2s(m2))
    # aitmc{Y0u_are_a_master_0f_Wiener_Hack}
    

你可能感兴趣的:(python,开发语言,网络安全)