仿射密码
古典密码,且属于单表加密。
加密算法
-
仿射密码公式
c = m×k + b mod 26- c是密文,m是明文,m作为26字母中的明文,因此计算出来的密文要模26
- 仿射密码是对单个字母加密,因此加密文本的时候会采用循环加密
-
k
k在放射密码中作为乘数- k要与b要互素
- 因为k要做乘数,所以必须要和26互素,否则加密失败
-
b
b在放射密码中作为加数- b要与k互素
key_k = 9
key_b = 7
cipher = [] #存放对应的密文数字
p = 26
mess = 'abc'
for ch in mess: # 首先将所有信息转化为大写字母, 非字母的不进入存储
if ord('A') <= ord(ch) <= ord('Z') \
or ord('a') <= ord(ch) <= ord('z'):
temp_num = ((ord(ch.upper()) - ord('A')) * key_k + key_b) % p
cipher.append(temp_num)
print(cipher)
mess = ''
#将转化出来的密文数字转为加密后的密文字母并打印出来
for i in cipher:
mess+=chr(i+ord('A'))
print(mess)
解密算法
- 裴蜀等式求逆
点击查看欧几里德算法->裴蜀等式算法讲解
x = 0
y = 0
#计算模运算
def ext_gcd(a, b):
global x
global y
if (b == 0):
x = 1
y = 0
return a
res = ext_gcd(b, a % b)
x1 = x
x = y
y = x1 - a // b * y
return res
# //线性方程 ax + by = m,当m是gcd(a.b)的倍数时有解
#求解线性方程解
def linearEquation(a, b, m):
global x
global y
d = ext_gcd(a, b)
if (m % d != 0):
print("无解")
return
else:
n = m // d
x *= n;
y *= n;
return x, y
- 仿射密码解密全过程
(这里用到了上面两个函数,记得拷贝上面的代码再用下面的)
key_k = 9
key_b = 7
cipher = 'HQZ'
p = 26
deCipher = []
temp = 0
dit = linearEquation(key_k, p, math.gcd(key_k, p))
key_k_1 = dit[0]
print('k的逆:', key_k_1)
for ch in cipher:
if ord('A') <= ord(ch) <= ord('Z') \
or ord('a') <= ord(ch) <= ord('z'):
temp = ((ord(ch.upper()) - ord('A') - key_b) * key_k_1) % p
deCipher.append(temp)
message = ''
# 输出
for i in deCipher:
message += chr(i + ord('A'))
print(message)