Hill Cipher密码
希尔密码是一种多表替代密码,由数学家 Lester S. Hill 在 1929 年提出。它的独特之处在于,它首次将线性代数和模运算系统地应用在密码学中,与之前依靠简单置换或移位的密码(如凯撒密码)相比,在概念上是一个巨大的飞跃
希尔密码的核心思想是:将明文分成等长的分组(向量),然后用一个密钥矩阵乘以这些明文向量,得到密文向量
算法原理
加密步骤
密钥处理
- 字符数字化
- A = 0, B = 1, C = 2, …, Z = 25
- 选择密钥矩阵
- 密钥是一个 n × n 的方阵,其中 n 是分组的大小。
- 这个矩阵必须是可逆的,并且在模 26 的世界里也必须可逆(即它的行列式与 26 互质,gcd(det(K), 26) = 1)否则,我们将无法解密
K = | 3 3 |
| 2 5 |我们可以验证这个密钥是有效的:行列式 (35 - 23) = 15 - 6 = 9。gcd(9, 26) = 1,满足条件。
- 加密过程 假设我们要加密明文 “HELLO”,分组大小 n=2。
- 分组与数字化
“HE” -> H=7, E=4 -> 向量 P1 = [7, 4] “LL” -> L=11, L=11 -> 向量 P2 = [11, 11] “O” 最后一个字母不够一组,需要填充r比如填充 ‘X’=23)所以 “OX” -> O=14, X=23 -> 向量 P3 = [14, 23]
- 矩阵乘法
对每个明文向量 P,执行矩阵乘法:C = K * P (mod 26)
- 加密第一个分组 “HE”:
所以 [7, 4] 被加密为 [7, 8],对应字母 “HI”。C1 = | 3 3 | * |7| = | (3*7 + 3*4) | = | (21 + 12) | = |33| -> |7| (mod 26) | 2 5 | |4| | (2*7 + 5*4) | | (14 + 20) | |34| -> |8|- 加密第二个分组 “LL”
所以 [11, 11] 被加密为 [14, 25],对应字母 “OZ”。C2 = | 3 3 | * |11| = | (3*11 + 3*11) | = | (33 + 33) | = |66| -> |14| (mod 26) | 2 5 | |11| | (2*11 + 5*11) | | (22 + 55) | |77| -> |25|- 加密第三个分组 “OX”
所以 [14, 23] 被加密为 [7, 13],对应字母 “HN”。C3 = | 3 3 | * |14| = | (3*14 + 3*23) | = | (42 + 69) | = |111| -> |7| (mod 26) | 2 5 | |23| | (2*14 + 5*23) | | (28 + 115) | |143| -> |13|
- 得到密文: 将所有的密文向量连接起来:[7,8] [14,25] [7,13] -> “HIOZHN”。
解密就给各位自己写一手了
希尔密码的特点
优点:
- 隐藏字符频率:由于是多表替代,同一个明文字母在不同位置会被加密成不同的密文字母(例如,例子中的 ‘L’ 被加密成了 ‘O’ 和 ‘Z’)。这有效地对抗了基于频率分析的攻击。
- 引入现代密码学概念:它将密码的强度依赖于密钥,而不是算法的保密性(柯克霍夫原则的早期体现)。
缺点:
- 完全线性:这是它最大的弱点。因为加密过程只是一个线性变换,它非常容易受到已知明文攻击。如果攻击者知道一个明文分组和对应的密文分组,就可以直接计算出密钥矩阵。
- 需要填充:当明文长度不是分组大小的整数倍时,需要进行填充。
- 密钥管理:密钥矩阵相对较大,分发和管理比简单密钥要麻烦。
代码
这个密码感觉像是思维拓展,所以各位思考思考就行了,我感觉没必要写代码了