BUAA^AITMCLAB&Level3题解

Level3题解

  • 分析加密过程:

    • 获取的大质数因子p、q满足: q < p < 2 q qq<p<2q
    • 设置的解密指数d满足: d < N 4 3 d<\frac{\sqrt[4]{N}}{3} d<34N
    • 可以想到采用低解密指数攻击破解flag
  • 低解密指数攻击(wiener-Attack):

    • L e t   N = p q   w i t h   q < p < 2 q .   L e t   d < N 4 3 G i v e n   w i t h   e d = 1 ( m o d   N ) . W e   c a n   e c i e n t l y   r e c o v e r   d . Let~N=pq~with~qLet N=pq with q<p<2q. Let d<34N Given with ed=1(mod N).We can eciently recover d.

    • Proof:

      基于连分数理论进行近似

      e d ≡ 1 ( m o d   ϕ ( N ) ) ⇒ ∃ k   s . t . e d − k ϕ ( N ) = 1 故    ∣ e ϕ ( N ) − k d ∣ = 1 d ϕ ( N )    因 为 d 与 ϕ ( N ) 很 小 , 所 以 k d 是 e ϕ ( N ) 的 近 似 值 由 p + q − 1 < 3 q − 1 < 3 q < 3 N 以 及 ϕ ( N ) = N − ( p + q ) + 1 可 得 ∣ N − ϕ ( N ) ∣ < 3 N 由 于 N 与 ϕ ( N ) 很 接 近 , 所 以 替 代 得 到 : ∣ e N − k d ∣ = ∣ e d − k ϕ ( N ) − k N + k ϕ ( N ) N d ∣ = ∣ 1 − k ( N − ϕ ( N ) ) N d ∣ ≤ ∣ 3 k ϕ ( N ) N d ∣ = 3 k d N 由 k ϕ ( N ) = e d − 1 < e d 且 e < ϕ ( N ) ⇒ k < d < N 4 3 故 ∣ e N − k d ∣ ≤ 1 d N 4 < 1 2 d 2 ed \equiv 1 (mod~\phi (N)) \Rightarrow \exists k~s.t.ed-k\phi (N)=1\\ 故~~ \left| \frac{e}{\phi (N)}-\frac{k}{d} \right| =\frac{1}{d\phi (N)}~~ 因为d与\phi (N)很小,所以\frac{k}{d}是\frac{e}{\phi (N)}的近似值\\ 由p+q-1<3q-1<3q<3\sqrt{N}以及\phi (N)=N-(p+q)+1可得\\ \left| N-\phi (N) \right| <3\sqrt{N}\\ 由于N与\phi (N)很接近,所以替代得到:\\ \left| \frac{e}{N}-\frac{k}{d} \right|= \left| \frac{ed-k\phi(N)-kN+k\phi(N)}{Nd} \right|= \left| \frac{1-k(N-\phi(N))}{Nd} \right|\\\leq \left| \frac{3k\phi(N)}{Nd} \right|=\frac{3k}{d\sqrt{N}}\\ 由k\phi(N)=ed-1ed1(mod ϕ(N))k s.t.edkϕ(N)=1  ϕ(N)edk=dϕ(N)1  dϕ(N)dkϕ(N)ep+q1<3q1<3q<3N ϕ(N)=N(p+q)+1Nϕ(N)<3N Nϕ(N)Nedk=Ndedkϕ(N)kN+kϕ(N)=Nd1k(Nϕ(N))Nd3kϕ(N)=dN 3kkϕ(N)=ed1<ede<ϕ(N)k<d<34N Nedkd4N 1<2d21

      • 有Legendre Theorem
        p ∈ Z , q ∈ Z + , 若 ∣ x − p q ∣ < 1 2 q 2 , 那 么 p q 是 x 的 渐 进 分 数 收 敛 值 p\in \mathbb{Z},q\in\mathbb{Z^+},若 \left| x-\frac{p}{q} \right|< \frac{1}{2q^2},\\ 那么\frac{p}{q}是x的渐进分数收敛值 pZ,qZ+,xqp<2q21,qpx

      • 我们可以对 e N \frac{e}{N} Ne使用连分数获得渐进分数,总有一个就是既约分数 k d \frac{k}{d} dk(因为 ( k , d ) = 1 (k,d)=1 (k,d)=1)

    • 恢复私钥d后,我们可以采用韦达定理进一步分解 N = p q N=pq N=pq(当然也可以直接通过d进行解密)

    • 代码实现:

      def cf_expansion(a, b):
          """
          连分数表示计算:[a0,a1,...,an]
          """
          cf_e = []
          while b:
              cf_e += [a // b]
              a, b = b, a % b
          return cf_e
      
      def cal_fra_nd(sub_cf_lst):
          """
          计算渐进分数的分子(num)和分母(deno)
          """
          num = 0
          deno = 1
          for sub in sub_cf_lst[::-1]:
              num, deno = deno, sub * deno + num
          return num, deno
      
      def cal_fra(x, y):
          """
          计算渐进分数值序列
          """
          cf = cf_expansion(x, y)
          cf = list(map(cal_fra_nd, (cf[0:i] for i in range(1, len(cf)))))
          return cf
      
      def veda_pq(a, b, c):
          """
          韦达定理,已知p+q与pq求解p、q
          """
          delta_sqrt = iroot(b ** 2 - 4 * a * c, 2)[0]
          x1 = (-b + delta_sqrt) // (2 * a)
          x2 = (-b - delta_sqrt) // (2 * a)
          return x1, x2
      
      def wiener_attack(e, n):
          """
          低解密指数攻击:
          params:加密指数e、模数n
          """
          for (d, k) in cal_fra(e, n):
              if k == 0:
                  continue
              if (d * e - 1) % k != 0:
                  continue
              phi = (d * e - 1) // k
              p, q = veda_pq(1, n - phi + 1, n)
              if p * q == n:
                  return abs(p), abs(q)
      
  • 解密实现:

    if __name__ == "__main__":
        d, p, q = wiener_attack(e, N)
        print(n2s(fast_power(c, d, N)))
        # aitmc{Wooo!!!You_are_a_master_of_Wiener_Hack!But_are_you_true_master??}
    

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