python代码写Hill密码参数选取:密钥矩阵和明文/密文的元素均取自 Z26密钥矩阵为:{8,6,9,5,6,9,5,10,5,8,4,9,10,6,11,4}输入姓名全拼和学号后进行加密和解密
时间: 2024-05-07 11:20:13 浏览: 73
密码加密解密
首先,我们需要将密钥矩阵转换为一个 4x4 的矩阵:
```
8 6 9 5
6 9 5 10
5 8 4 9
10 6 11 4
```
接下来,我们需要确定加密和解密时使用的密钥。
Hill密码的密钥矩阵必须是可逆的,也就是说,它的行列式必须为非零值。我们可以使用 numpy 库来计算行列式。
```python
import numpy as np
key = np.array([[8, 6, 9, 5], [6, 9, 5, 10], [5, 8, 4, 9], [10, 6, 11, 4]])
det = np.linalg.det(key)
if det == 0:
print("密钥矩阵不可逆!")
else:
print("密钥矩阵可逆。")
```
由于密钥矩阵可逆,我们可以继续进行加密和解密。
加密时,我们需要将明文转换为数字矩阵,然后使用密钥矩阵进行乘法运算,最后将结果转换为密文。
```python
# 将明文转换为数字矩阵
plaintext = "zhangsan2019"
plaintext = plaintext.replace(" ", "").replace("0", "26").upper()
n = len(plaintext)
if n % 4 != 0:
plaintext += "X" * (4 - n % 4)
n = len(plaintext)
matrix = np.zeros((n // 4, 4))
for i in range(n):
row = i // 4
col = i % 4
matrix[row][col] = ord(plaintext[i]) - 65
# 使用密钥矩阵进行乘法运算
ciphertext = ""
for i in range(n // 4):
row = matrix[i, :]
row = np.dot(row, key) % 26
for j in range(4):
ciphertext += chr(int(row[j]) + 65)
print("密文:", ciphertext)
```
解密时,我们需要将密文转换为数字矩阵,然后使用密钥矩阵的逆矩阵进行乘法运算,最后将结果转换为明文。
```python
# 计算密钥矩阵的逆矩阵
key_inv = np.linalg.inv(key)
key_inv = key_inv.astype(int) % 26
# 将密文转换为数字矩阵
ciphertext = "VZQYKALXJXKZ"
n = len(ciphertext)
matrix = np.zeros((n // 4, 4))
for i in range(n):
row = i // 4
col = i % 4
matrix[row][col] = ord(ciphertext[i]) - 65
# 使用逆矩阵进行乘法运算
plaintext = ""
for i in range(n // 4):
row = matrix[i, :]
row = np.dot(row, key_inv) % 26
for j in range(4):
plaintext += chr(int(row[j]) + 65)
# 去除补全的 X
plaintext = plaintext.replace("X" * (4 - n % 4), "")
plaintext = plaintext.replace("26", "0")
plaintext = plaintext.lower()
print("明文:", plaintext)
```
完整代码如下:
阅读全文