仿射密码

仿射密码

仿射密码是一种替换密码。它是一个字母对一个字母的。

  • 加密函数

$e(x)=ax+b{\pmod {m}}$

其中 $a$ 和 $m$ 互质,$m$ 是字母的数目。

  • 解密函数

$d(x)=a^{-1}(x-b){\pmod {m}}$

其中 $a^{-1}$ 是 $a$ 在 $ \mathbb {Z} _{m}$ 群的乘法逆元。

仿射密码为单表加密的一种,字母系统中所有字母都由简单数学方程加密,对应至数值,或转回字母。 其仍有所有替代密码之弱处。所有字母皆借由方程 $(ax+b)\pmod {26}$ 加密,$b$ 为移动大小。

当 $a=1$,仿射加密为凯撒密码,因该加密方程可简化为线性移动。

代码

  • 对应字母表
1
2
3
4
# 仿射密码对应字母表
def affine(a, b):
for i in range(26):
print chr(i+65) + ": " + chr(((a*i+b)%26)+65)
  • 一般情况
1
2
3
4
5
6
7
8
9
import gmpy2
def affline_decode(cipher_text, a, b, m):
plain_text = ''
for i in cipher_text:
if i in 'abcdefghijklmnopqrstuvwxyz':
plain_text += chr(((ord(i)-ord('a'))-b)*gmpy2.invert(a,m) % m + ord('a'))
else:
plain_text += i
print(plain_text)