一杯敬故乡,一杯敬远方
算法分析
- 仿射密码结合了移位密码和乘数密码的特点,是移位密码和乘数密码的组合。
- 仿射密码的加密算法就是一个线性变化,即对明文字符x,对应的密文字符为
y=ax+b(mod26)其中,a, b属于Z26且gcd(a,b)=1 - 实现过程:
- 选取
a,b两个参数,其中gcd(a, 26)=1 - 加密变换:
c= a∗𝑚+b 𝑚𝑜𝑑 26a=1时,移位密码b=1时,乘数密码 - 解密变换:
𝑚= (c−b)∗a^(−1) 𝑚𝑜𝑑 26
算法实现
1 | # 暴力破解 |
加密与解密
- 加密:输入
a = 3, b = 4时,加密结果如图所示:

- 解密:知道秘钥
k = 9, b = 4(k为a的逆元)时,解出相应明文。

正确性
由于算法的前提要求gcd(a,26)==1, 从而使加密函数c= a∗𝑚+b 𝑚𝑜𝑑 26是一个单射函数,故其解必然是唯一的。即,gcd(a,26)==1保证了仿射加密函数是一个双射函数,故算法正确。
安全性分析
- 此密码算法安全性较弱。由算法的实现可知,此算法的秘钥空间大小为
12*26 – 1 ==311(去除a = 1, b = 0时的情况)且a = 1,3,5,7,9,11,15,17,19,21,23,25故很容易便能够通过暴力破解获得明文。

- 还可以通过统计分析破解:代码如下
1 | #统计破解仿射密码 |
运行结果为(此处以破解a=3, b=4时得出的密文):

如图所示,正确解出a, b再用(a*k)%26==1,求得k=9用k=9,b=4进行解密可得出明文。
- 还可以通过差分分析进行破解。对于仿射密码来说,“差分”是模26减法,那么,在不知道两对明密文对
(M1,C1)(M2, C2)的情况下,只需要知道M1-M2和C1-C2便可以确定a。因为C1 = aM1 + b(mod26)
C2 = aM2 + b(mod26)
易得,a = (C1 – C2)/(M1 – M2) (mod26)
得到a 后,进一步找到b就很容易了。