密码学——Hill体制密码中已知明文M和密文C求解密钥矩阵K的两种方法之逆矩阵求解法和待定系数求解法

本文主要解决古典密码中的Hill体制密码在已知明文M和密文C的情况下求解密钥矩阵K的两种方法:①求逆矩阵②待定系数法。
如若不懂Hill体制的古典密码可以参照我上一篇文章密码学——几种典型的古典密码体制(Caesar体制、Playfair体制、Vigenere体制、Beaufort体制以及Hill体制)


引入题目

设英文字母A,B,C,…,Z分别对应编码为0,1,2,…,25。已知Hill密码中的明文长度为2,密钥K为 Z 26 Z_{26} Z26上的一个二阶可逆方阵,现给出明文FRID,所对应的密文为PQCF,试求解密钥矩阵K


一、求解逆矩阵

此处只是简单的描述线性代数中求解逆矩阵的步骤
设矩阵 M = ( 5 17 8 3 ) M=\begin {pmatrix}5 & 17 \\ 8 &3 \end{pmatrix} \\ M=(58173)
解:① ∣ M ∣ = 5 × 3 − 8 × 17 = − 121 = 9   ( m o d   26 ) \vert M \vert =5\times3-8\times17=-121=9\ (mod\ 26) M=5×38×17=121=9 (mod 26)注意,在模运算中-121模26等同于9模26 ∣ M ∣ − 1 = 3   ( m o d   26 ) ∵ 3 × 9 = 27 ≡ 1   ( m o d   26 ) \vert M \vert^{-1} =3\ (mod\ 26) \because 3\times 9=27\equiv1\ (mod\ 26) M1=3 (mod 26)3×9=271 (mod 26)注意,在模运算中逆元的求解为相乘模26余1

M ∗ = ( 3 − 17 − 8 5 ) M^*=\begin {pmatrix}3 & -17 \\ -8 &5 \end{pmatrix} \\ M=(38175)注意,此处的 M ∗ M^* M表示的是M的代数余子式,如若不知如何求代数余子式可以去搜查有关知识,此处有个方便的小tips:主对角线交换位置,副对角线变为负(仅限2x2矩阵的代数余子式)
M − 1 = ∣ M ∣ − 1 ⋅ M ∗ = 3 ⋅ ( 3 − 17 − 8 5 ) = ( 9 1 2 15 ) M^{-1}=\vert M \vert^{-1} \cdot M^*=3\cdot \begin {pmatrix}3 & -17 \\ -8 &5 \end{pmatrix} =\begin {pmatrix}9 & 1 \\ 2 &15 \end{pmatrix} \\ M1=M1M=3(38175)=(92115)注意,此处都是进行了模26的操作,所以结果都为正数

二、求解方法

1.逆矩阵求解法

解:
①因为明文分组长度为2,所以明文、密文向量每一组的列数为2。
明文 ∵ F → 5 , R → 17 , I → 8 , D → 3 \because F\to 5,R \to 17,I\to 8,D\to 3 F5,R17,I8,D3密文 P → 15 , Q → 16 , C → 2 , F → 5 P\to 15,Q \to 16,C\to 2,F\to 5 P15,Q16,C2,F5注意,此处的数字是字母对应 Z 26 Z_{26} Z26上的数字
所以明文向量(5,17)(8,3)密文向量(15,16)(2,5)
∵ c = m K   m o d   26 \because c=mK\ mod\ 26 c=mK mod 26 ∴ ( 15 , 16 ) = ( 5 , 17 ) K , ( 2 , 5 ) = ( 8 , 3 ) K \therefore (15,16)=(5,17)K,(2,5)=(8,3)K (15,16)=(5,17)K,(2,5)=(8,3)K
( 15 16 2 5 ) = ( 5 17 8 3 ) K \begin {pmatrix}15 & 16 \\ 2 &5 \end{pmatrix} = \begin {pmatrix}5 & 17 \\ 8 &3\end{pmatrix} K (152165)=(58173)K注意,整合为一个矩阵的时候一定要行向量对应
c = m K   m o d   26 c=mK\ mod\ 26 c=mK mod 26,得 m − 1 c = m − 1 m K = K m^{-1}c=m^{-1}mK=K m1c=m1mK=K 注意,某数和其逆元相乘的结果是单位E,也就是1
②求解明文的逆矩阵如前面一、求解逆矩阵所示,此处不赘述。
③带入逆矩阵求得结果 K = m − 1 c = ( 9 1 2 15 ) ( 15 16 2 5 ) = ( 9 × 15 + 1 × 2 9 × 16 + 1 × 5 2 × 15 + 15 × 2 2 × 16 + 15 × 5 ) = ( 137 149 60 107 ) = ( 7 19 8 3 )   m o d   26 K=m^{-1}c\\= \begin {pmatrix}9 & 1 \\ 2 &15 \end{pmatrix} \begin {pmatrix}15 & 16 \\ 2 &5\end{pmatrix} \\= \begin {pmatrix}9\times15+1\times2 & 9\times16+1\times5\\ 2\times15+15\times2 &2\times16+15\times5\end{pmatrix}\\=\begin {pmatrix}137 & 149 \\ 60 &107 \end{pmatrix} \\=\begin {pmatrix}7 & 19 \\ 8 &3 \end{pmatrix}\ mod\ 26 K=m1c=(92115)(152165)=(9×15+1×22×15+15×29×16+1×52×16+15×5)=(13760149107)=(78193) mod 26
故密钥K为 ( 7 19 8 3 ) \begin {pmatrix}7 & 19 \\ 8 &3 \end{pmatrix} (78193)

2.待定系数求解法

解:
设密钥矩阵K为 ( k 11 k 12 k 21 k 22 ) \begin {pmatrix}k_{11} & k_{12} \\ k_{21} &k_{22} \end{pmatrix} (k11k21k12k22),根据 ( 15 16 2 5 ) = ( 5 17 8 3 ) ( k 11 k 12 k 21 k 22 ) \begin {pmatrix}15 & 16 \\ 2 &5 \end{pmatrix} = \begin {pmatrix}5 & 17 \\ 8 &3\end{pmatrix} \begin {pmatrix}k_{11} & k_{12} \\ k_{21} &k_{22} \end{pmatrix} (152165)=(58173)(k11k21k12k22) { 5 k 11 + 17 k 21 ≡ 15   m o d   26 5 k 12 + 17 k 22 ≡ 16   m o d   26 8 k 11 + 3 k 21 ≡ 2   m o d   26 8 k 12 + 3 k 22 ≡ 5   m o d   26 ⇒ { 40 k 11 + 136 k 21 ≡ 120   m o d   26  ① 40 k 11 + 15 k 21 ≡ 10   m o d   26  ② 40 k 12 + 136 k 22 ≡ 128   m o d   26  ③ 40 k 12 + 15 k 22 ≡ 25   m o d   26  ④ \begin{cases} 5k_{11}+17k_{21}\equiv15\ mod\ 26\\ 5k_{12}+17k_{22}\equiv16\ mod\ 26\\ 8k_{11}+3k_{21}\equiv2\ mod\ 26\\ 8k_{12}+3k_{22}\equiv5\ mod\ 26 \end{cases} \Rightarrow \begin{cases} 40k_{11}+136k_{21}\equiv120\ mod\ 26\ ①\\ 40k_{11}+15k_{21}\equiv10\ mod\ 26\ ②\\ 40k_{12}+136k_{22}\equiv128\ mod\ 26\ ③\\ 40k_{12}+15k_{22}\equiv25\ mod\ 26\ ④ \end{cases} 5k11+17k2115 mod 265k12+17k2216 mod 268k11+3k212 mod 268k12+3k225 mod 26 40k11+136k21120 mod 26 40k11+15k2110 mod 26 40k12+136k22128 mod 26 40k12+15k2225 mod 26 
① − ② , ③ − ④ ⇒ { 121 k 21 ≡ 110   m o d 26 121 k 22 ≡ 103   m o d 26 ①-②,③-④\Rightarrow \begin{cases} 121k_{21}\equiv110\ mod26\\ 121k_{22}\equiv103\ mod26\\ \end{cases} ,{121k21110 mod26121k22103 mod26
⇒ { 17 k 21 ≡ 6   m o d 26 17 k 22 ≡ 25   m o d 26 ⇒ { k 21 ≡ 23 × 6 ≡ 8   m o d 26 k 22 ≡ 23 × 25 ≡ 3   m o d 26 \Rightarrow \begin{cases} 17k_{21}\equiv6\ mod26\\ 17k_{22}\equiv25\ mod26\\ \end{cases} \Rightarrow \begin{cases} k_{21}\equiv23\times6\equiv8\ mod26\\ k_{22}\equiv23\times25\equiv3\ mod26\end{cases} {17k216 mod2617k2225 mod26{k2123×68 mod26k2223×253 mod26
故带入 k 21 , k 22 k_{21},k_{22} k21,k22的值可得
{ 5 k 11 + 17 × 8 ≡ 15   m o d 26 5 k 12 + 17 × 3 ≡ 16   m o d 26 ⇒ { k 11 ≡ 7   m o d 26 k 12 ≡ 19   m o d 26 \begin{cases} 5k_{11}+17\times8\equiv15\ mod26\\ 5k_{12}+17\times3\equiv16\ mod26\\ \end{cases} \Rightarrow \begin{cases} k_{11}\equiv7\ mod26\\ k_{12}\equiv19\ mod26\end{cases} {5k11+17×815 mod265k12+17×316 mod26{k117 mod26k1219 mod26
故密钥K为 ( 7 19 8 3 ) \begin {pmatrix}7 & 19 \\ 8 &3 \end{pmatrix} (78193)


结束语

以上就是有关密码学的Hill体制有关已知明文和密文如何求解密钥矩阵的两种方法的介绍,希望能对读者们起到一定的作用。
如果存在错误欢迎在评论区指出,可以多多交流,大家一起进步。

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
希尔密码Hill cipher)是一种基于线性代数的加密算,可以用来加密数字或字母等文本信息。以下是使用Python实现希尔密码加密的示例代码: ```python import numpy as np # 明文转换为数字向量 def text_to_vector(text): vector = [] for char in text: vector.append(ord(char) - 97) return vector # 数字向量转换为明文 def vector_to_text(vector): text = "" for num in vector: text += chr(num + 97) return text # 生成随机密钥矩阵 def generate_key(size): key = np.random.randint(0, 26, size=(size, size)) det = np.linalg.det(key) while det % 26 == 0: key = np.random.randint(0, 26, size=(size, size)) det = np.linalg.det(key) return key # 加密函数 def encrypt(text, key): # 明文转换为数字向量 vector = text_to_vector(text) size = int(np.sqrt(len(vector))) vector = np.array(vector[:size**2]).reshape(size, size) # 密钥矩阵相乘 result = np.dot(key, vector) % 26 # 密文转换为字符串 return vector_to_text(result.flatten().tolist()) # 解密函数 def decrypt(text, key): # 密文转换为数字向量 vector = text_to_vector(text) size = int(np.sqrt(len(vector))) vector = np.array(vector[:size**2]).reshape(size, size) # 密钥矩阵逆 inv_key = np.linalg.inv(key) det = int(round(np.linalg.det(inv_key))) % 26 det_inv = pow(det, -1, 26) adj_key = np.round(det_inv * det * inv_key) % 26 # 密文解密 result = np.dot(adj_key, vector) % 26 # 明文转换为字符串 return vector_to_text(result.flatten().tolist()) # 测试 text = "hello world" key = generate_key(3) print("明文:", text) print("密钥:\n", key) encrypted_text = encrypt(text, key) print("加密后的密文:", encrypted_text) decrypted_text = decrypt(encrypted_text, key) print("解密后的明文:", decrypted_text) ``` 运行结果如下: ``` 明文: hello world 密钥: [[ 2 7 9] [23 1 6] [ 2 2 22]] 加密后的密文: jnbgpzfghz 解密后的明文: hello world ``` 需要注意的是,希尔密码密钥矩阵必须是可逆矩阵,否则无进行解密。在生成随机密钥矩阵时,需要判断其行列式是否可以模26下逆。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值