BUAA^AITMCLAB&LAB4题解

LAB4题解:

  • 分析加密过程:

    • 可以发现是Hill Cipher,密钥矩阵分别为三阶和五阶,解密关键是找到密钥矩阵 K K K在模运算意义下的逆矩阵 K − 1 K^{-1} K1, 即:
      K K − 1 ≡ I   ( m o d   26 ) KK^{-1}\equiv I~(mod~26) KK1I (mod 26)
  • 关于希尔密码:

    • 加密:

      1. a-z分别对应0-25

      2. p = ( p 1 , p 2 , . . . , p l ) p=(p_1, p_2,...,p_l) p=(p1,p2,...,pl) p i ∈ P = ( Z m ∗ ) n p_i\in P = (\mathbb{Z_m^*})^n piP=(Zm)n,故有明文矩阵:

        m s g = [ p 1 p 2 . . . p n p n + 1 p n + 2 . . . p 2 n . . . . . . . . . . . . p g p g + 1 . . . p g n ] 其 中 , g = ⌈ l / n ⌉ , 且 p l + 1 ~ p g l 均 为 0 msg = \left[\begin{matrix} p_1&p_2&...&p_n\\ p_{n+1}&p_{n+2}&...&p_{2n}\\ ...&...&...&...\\ p_g& p_{g+1}&...&p_{gn} \end{matrix}\right]\\ 其中,g=\lceil l/n\rceil,且p_{l+1}~p_{gl}均为0 msg=p1pn+1...pgp2pn+2...pg+1............pnp2n...pgng=l/n,pl+1pgl0

      3. 密钥矩阵 k e y ∈ K = G L ( n ,   Z m ) key \in K=GL(n,~\mathbb{Z_m}) keyK=GL(n, Zm)

      4. 加密变换: c p r = m s g ∗ k e y   ( m o d   26 ) cpr = msg*key~(mod~26) cpr=msgkey (mod 26)

    • 解密:

      1. c = ( c 1 , c 2 , . . . , c l ) c=(c_1,c_2,...,c_l) c=(c1,c2,...,cl) p i ∈ C = ( Z m ∗ ) n p_i\in C=(\mathbb{Z_m^*})^n piC=(Zm)n故有密文矩阵 c p r cpr cpr

      2. 解密变换: m s g = c p r ∗ k e y − 1 ( m o d   26 ) msg = cpr*key^{-1}(mod~26) msg=cprkey1(mod 26)

  • 解密过程实现:

    • 关于python的sympy库使用它的原因是它可以很方便地求取模运算意义下的逆矩阵(doge

      • Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。

      • 官方在线文档

      • 安装:

        pip install sympy
        
    • 可以注意到,矩阵和字符串的相互转换操作很频繁,所以我们首先将其函数化便于调用:

      • 函数s2m:将字符串按要求转换为矩阵

        def s2m(s, n):
            """
            convert str to matrix
            :param s: str
            :param n: cols
            :return: m: Matrix
            """
            g = ceil(len(s) / n)
            m = Matrix.zeros(g, n)  # 生成零矩阵
            k = 0
            for i in range(g):
                for j in range(n):
                    m[i, j] = ord(s[k]) - ord('a')
                    k += 1
            # print(latex(m))
            return m
        

        **注意:**lab4加密过程中, g = l e n ( p ) / / n g=len(p)//n g=len(p)//n,这是因为助教的数据保证了g是整数,实际应用中需要采用之前提到的向上取整进行计算,最后矩阵不足的补为0即可

      • 函数m2s:将矩阵按要求还原为字符串

        def m2s(mtx: Matrix):
            """
            convert matrix to string
            :param mtx: Matrix
            :return: s: str
            """
            s = ""
            g, n = mtx.shape
            for i in range(g):
                for j in range(n):
                    s += chr(mtx[i, j] + ord('a'))
            return s
        
    • 解密变换函数实现:

      def decrypt(cpr, n, key: Matrix):
          """
          Hill Cipher decryption
          :param cpr: cipher str
          :param n: cols
          :param key: Matrix
          :return: msg: plaintext
          """
          m = s2m(cpr, n)
          key_inv = key.inv_mod(26)
          msg = m * key_inv % 26
          return m2s(msg)
      
  • flag获取主流程:

    from sympy import Matrix, latex
    from math import ceil
    if __name__ == "__main__":
        n1 = 3
        n2 = 5
        key1 = Matrix([
            [10, 19, 13],
            [19, 24, 5],
            [24, 9, 2]])
        key2 = Matrix([
            [2, 5, 9, 10, 11],
            [11, 7, 3, 1, 8],
            [23, 21, 15, 8, 1],
            [19, 18, 20, 16, 3],
            [18, 17, 16, 15, 2]])
        cipher1 = "mmfpshozuggueac"
        cipher2 = "hrqmldzrzcoyymc"
        print(f"flag{{{decrypt(cipher1, 3, key1)+decrypt(cipher2, 5, key2)}}}")
        # flag{longtimenoseeeethislabissoeasy}
    

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