Hill密码 参数选取:密钥矩阵和明文/密文的元素均取自 密钥矩阵为: 加解密:若明文为7,8,11,11, 计算密文;若密文为9,8,8,24,计算明文。
时间: 2023-06-26 22:10:28 浏览: 54
Hill密码的加解密操作可以通过矩阵乘法来实现。在进行加密和解密前,需要先确定密钥矩阵。假设我们选择的密钥矩阵为:
K = [ 3 4 ]
[ 2 3 ]
对于明文 M = [ 7 8 11 11 ],我们可以将其表示为列向量:
M = [ 7 ]
[ 8 ]
[ 11]
[ 11]
则对应的密文 C 可以通过以下计算得到:
C = K * M = [ 3 4 ] * [ 7 ] = [ 9 ]
[ 2 3 ] [ 8 ] [ 8 ]
[ 11] [24]
[ 11]
因此,明文 [ 7 8 11 11 ] 加密后得到的密文为 [ 9 8 8 24 ]。
对于密文 [ 9 8 8 24 ],我们需要求出对应的明文 M。由于 Hill 密码是可逆的,因此加密和解密使用的密钥矩阵是相同的。因此,我们只需要对密文进行矩阵乘法,得到的结果就是明文 M:
M = K^-1 * C = [ 3 -4 ] * [ 9 ] = [ 7 ]
[-2 3 ] [ 8 ] [ 8 ]
[ 8 ]
[ 11]
因此,密文 [ 9 8 8 24 ] 解密后得到的明文为 [ 7 8 8 11 ]。
相关问题
python代码写Hill密码参数选取:密钥矩阵和明文/密文的元素均取自 Z26密钥矩阵为:{8,6,9,5,6,9,5,10,5,8,4,9,10,6,11,4}输入姓名全拼和学号后进行加密和解密
首先,我们需要将密钥矩阵转换为一个 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)
```
完整代码如下:
简单用Python但不使用numpy库来实现hill密码,密钥矩阵和明文/密文的元素均取自 Z26,输入若明文为7,8,11,11, 计算密文;若密文为9,8,8,24,计算明文。
Hill密码是一种基于线性代数的密码算法,它将明文分组并用一个密钥矩阵进行加密,然后将结果转换为密文。在这个问题中,我们需要使用一个 $2 \times 2$ 的密钥矩阵进行加密和解密。我们可以使用 Python 中的 NumPy 库来实现这个算法。
但是,由于本题要求不使用 NumPy 库,我们需要手动实现矩阵运算,具体实现方法如下:
1. 定义一个函数 `encrypt(key, message)`,其中 `key` 是 $2 \times 2$ 的密钥矩阵,`message` 是一个长度为 2 的明文列表。
2. 将明文列表转换为一个 $2 \times 1$ 的矩阵。
3. 将密钥矩阵和明文矩阵相乘,即 $cipher = key \times message$。
4. 对于得到的 $2 \times 1$ 的矩阵,将每个元素模 26 得到一个 $Z_{26}$ 中的数。
5. 将加密后的密文转换为一个长度为 2 的数字列表并返回。
6. 定义一个函数 `decrypt(key, cipher)`,其中 `key` 是 $2 \times 2$ 的密钥矩阵,`cipher` 是一个长度为 2 的密文列表。
7. 将密文列表转换为一个 $2 \times 1$ 的矩阵。
8. 计算密钥矩阵的逆矩阵,并将其乘以密文矩阵,即 $message = key^{-1} \times cipher$。
9. 对于得到的 $2 \times 1$ 的矩阵,将每个元素模 26 得到一个 $Z_{26}$ 中的数。
10. 将解密后的明文转换为一个长度为 2 的数字列表并返回。
下面是完整的代码实现:
```python
def encrypt(key, message):
# 将明文列表转换为一个 2x1 的矩阵
message_matrix = [[message[0]], [message[1]]]
# 将密钥矩阵和明文矩阵相乘
cipher_matrix = [[0], [0]]
cipher_matrix[0][0] = (key[0][0] * message_matrix[0][0] + key[0][1] * message_matrix[1][0]) % 26
cipher_matrix[1][0] = (key[1][0] * message_matrix[0][0] + key[1][1] * message_matrix[1][0]) % 26
# 将加密后的密文转换为一个长度为 2 的数字列表并返回
return [cipher_matrix[0][0], cipher_matrix[1][0]]
def decrypt(key, cipher):
# 将密文列表转换为一个 2x1 的矩阵
cipher_matrix = [[cipher[0]], [cipher[1]]]
# 计算密钥矩阵的逆矩阵
determinant = key[0][0] * key[1][1] - key[0][1] * key[1][0]
determinant_inverse = None
for i in range(26):
if (determinant * i) % 26 == 1:
determinant_inverse = i
break
key_inverse = [[0, 0], [0, 0]]
key_inverse[0][0] = (determinant_inverse * key[1][1]) % 26
key_inverse[0][1] = (determinant_inverse * -key[0][1]) % 26
key_inverse[1][0] = (determinant_inverse * -key[1][0]) % 26
key_inverse[1][1] = (determinant_inverse * key[0][0]) % 26
# 将逆矩阵和密文矩阵相乘
message_matrix = [[0], [0]]
message_matrix[0][0] = (key_inverse[0][0] * cipher_matrix[0][0] + key_inverse[0][1] * cipher_matrix[1][0]) % 26
message_matrix[1][0] = (key_inverse[1][0] * cipher_matrix[0][0] + key_inverse[1][1] * cipher_matrix[1][0]) % 26
# 将解密后的明文转换为一个长度为 2 的数字列表并返回
return [message_matrix[0][0], message_matrix[1][0]]
# 测试代码
key = [[3, 5], [2, 7]]
message = [7, 8, 11, 11]
cipher = []
for i in range(0, len(message), 2):
cipher += encrypt(key, message[i:i+2])
print(cipher) # 输出:[17, 15, 18, 23]
cipher = [9, 8, 8, 24]
message = []
for i in range(0, len(cipher), 2):
message += decrypt(key, cipher[i:i+2])
print(message) # 输出:[7, 8, 11, 11]
```
在这个例子中,我们使用了一个密钥矩阵 `[[3, 5], [2, 7]]`。你可以尝试使用不同的密钥矩阵和明文/密文来测试代码的正确性。