一种密码方法——逆矩阵的应用
根据如下图片讲述的算法,实现一种加密解密算法,可输入明文,获得“密码”,亦可“解密”
参考文献
数学建模入门--125个有趣的经济管理问题
根据如下图片讲述的算法,实现一种加密解密算法,可输入明文,获得“密码”,亦可“解密”
数学建模入门--125个有趣的经济管理问题
import numpy as np
letters = [' ','A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
word_standard = []
save_numbers=[]
read_number=[]
return_word=[]
decode=''
codes=''
word=input("请输入想要加密的明文:")
word_standard.append(word.upper())
for i in (','.join(word_standard)):
for j in range(len(letters)):
if i == letters[j] :
save_numbers.append(j)
row = len(save_numbers) / 3
M = np.mat(np.array(save_numbers).reshape(int(row),3))
A=np.mat([[-1,0,1],
[1,-1,1],
[1,1,0]])
MA = M*A
return_number=MA.tolist()
for m in return_number:
for n in range(len(m)):
read_number.append(m[n])
for i in read_number:
codes += letters[i]
print("密文为:" + codes.lower())
print("是否需要解密?(Y/N)")
judge = input()
if judge == 'N':
exit()
else:
m = (MA*A.I).tolist()
for a in m:
for b in range(len(a)):
return_word.append(round(a[b]))
for a in return_word:
decode += letters[a]
print("解密结果为:" + decode.title())
请输入想要加密的明文:Hill on Tuesday
密文为:mcqcolftncnzvxe
是否需要解密?(Y/N)
Y
解密结果为:Hill On Tuesday
import numpy as np
def generate_plaintext():
'''
生成明文
:return: 返回的是明文对应的数字
'''
num = [] # 存储明文对应的数字
while True:
info = input('请输入你要传递的明文:')
if len(info) % 3 == 0:
info = info.upper()
for alpha in info:
for key, values in dict_.items():
if alpha == values:
num.append(key)
break
else:
print('输入的明文长度要为3的整数倍!请重新输入!')
return num
def encryption(num, encr_matrix):
'''
加密
:param num:明文對應的數字
:param encr_matrix:加密矩陣
:return:返回加密后信息和矩陣
'''
encry_mess = '' # 存储加密信息
row = int(len(num) / 3)
col = 3
num_arr = np.array(num).reshape(row, col)
encr_info = np.matmul(num_arr, encr_matrix)
encr_info_ = encr_info.flatten()
for i in list(encr_info_):
encry_mess += dict_[i]
return encry_mess, encr_info
def deciphering(encr_info, encr_matrix):
'''
解密
:param encr_info:加密後的矩陣
:param encr_matrix:加密矩陣
:return:
'''
deci_info = '' # 存储解密后的信息
deci_matrix = np.linalg.inv(encr_matrix) # 產生解密矩陣
deci_arr = np.matmul(encr_info, deci_matrix)
deci_arr = np.around(deci_arr)
# deci_list = deci_arr.tolist()
deci_list = list(deci_arr.flatten())
# print(deci_list)
for i in deci_list:
deci_info += dict_[i]
return deci_info
if __name__ == '__main__':
dict_ = {0: ' ', 1: "A", 2: 'B', 3: "C", 4: 'D', 5: 'E', 6: "F", 7: 'G', 8: 'H',
9: "I", 10: 'J', 11: 'K', 12: "L", 13: 'M', 14: 'N', 15: "O", 16: 'P', 17: 'Q', 18: "R", 19: 'S',
20: 'T', 21: "U", 22: 'V', 23: 'W', 24: "X", 25: 'Y', 26: 'Z'}
num = generate_plaintext()
encr_matrix = np.array([[-1, 0, 1], [1, -1, 1], [1, 1, 0]])
# print(num)
encr_mess, encr_info = encryption(num, encr_matrix)
print('加密后的信息为:{}'.format(encr_mess))
info = input('请选择是否要进行解密:(y/n)')
if info == 'y':
deci_info = deciphering(encr_info, encr_matrix)
print('解密后的信息为:{}'.format(deci_info.lower()))
请输入你要传递的明文:hill on tuesday
加密后的信息为:MCQCOLFTNCNZVXE
请选择是否要进行解密:(y/n)y
解密后的信息为:hill on tuesday