python代码写Hill密码参数选取:密钥矩阵和明文/密文的元素均取自 Z26密钥矩阵为:{8,6,9,5,6,9,5,10,5,8,4,9,10,6,11,4},实现输入姓名全拼和学号后进行加密和解密
时间: 2024-05-04 22:18:36 浏览: 99
实现Hill密码的主要步骤是:
1. 将明文/密文中的每个字符映射为数字,这里可以使用A=0,B=1,......,Z=25的映射方式。
2. 将明文/密文中的字符序列转化为矩阵形式,矩阵的列数应该等于密钥矩阵的阶数。
3. 根据Hill密码加密/解密算法,计算矩阵乘积,并将结果转化为字符序列输出。
下面是实现这个过程的Python代码:
```python
import numpy as np
# 将字符转化为数字
def char_to_num(char):
return ord(char.upper()) - ord('A')
# 将数字转化为字符
def num_to_char(num):
return chr(num + ord('A'))
# 将字符串转化为矩阵
def string_to_matrix(string, n):
string = string.upper().replace(' ', '')
matrix = []
row = []
for i, char in enumerate(string):
row.append(char_to_num(char))
if (i + 1) % n == 0:
matrix.append(row)
row = []
if row:
while len(row) < n:
row.append(0)
matrix.append(row)
return np.array(matrix)
# 将矩阵转化为字符串
def matrix_to_string(matrix):
string = ''
for row in matrix:
for num in row:
string += num_to_char(num)
return string
# 加密函数
def encrypt(matrix, key_matrix):
n = key_matrix.shape[0]
m = matrix.shape[0] // n
encrypted_matrix = np.zeros((m, n), dtype=int)
for i in range(m):
encrypted_matrix[i] = np.dot(matrix[i*n:(i+1)*n], key_matrix) % 26
return encrypted_matrix
# 解密函数
def decrypt(matrix, key_matrix):
n = key_matrix.shape[0]
m = matrix.shape[0] // n
decrypted_matrix = np.zeros((m, n), dtype=int)
key_matrix_inv = np.linalg.inv(key_matrix)
key_matrix_det = round(np.linalg.det(key_matrix))
key_matrix_det_inv = pow(key_matrix_det, -1, 26)
for i in range(m):
decrypted_matrix[i] = np.dot(matrix[i*n:(i+1)*n], key_matrix_inv)
decrypted_matrix[i] *= key_matrix_det * key_matrix_det_inv
decrypted_matrix[i] %= 26
return decrypted_matrix
# 密钥矩阵
key_matrix = np.array([8, 6, 9, 5, 6, 9, 5, 10, 5, 8, 4, 9, 10, 6, 11, 4]).reshape((4, 4))
# 输入姓名全拼和学号
name = input('请输入姓名全拼:')
student_id = input('请输入学号:')
# 加密
plaintext = name + student_id
plaintext_matrix = string_to_matrix(plaintext, 4)
ciphertext_matrix = encrypt(plaintext_matrix, key_matrix)
ciphertext = matrix_to_string(ciphertext_matrix)
print('加密结果:', ciphertext)
# 解密
decrypted_matrix = decrypt(ciphertext_matrix, key_matrix)
decrypted = matrix_to_string(decrypted_matrix)
print('解密结果:', decrypted)
```
输入姓名全拼和学号后,程序会输出加密结果和解密结果。
阅读全文