pycharm代码改进 hill密码随机输入一段明文加密或者密文解密 出现TypeError: integer argument expected, got float
时间: 2024-02-27 08:51:42 浏览: 76
这个错误是因为你在代码中使用了一个浮点数,但是 Hill 密码算法只支持整数。你需要将浮点数转换为整数,可以使用 int() 函数。以下是一个示例:
```
import numpy as np
# 加密函数
def encrypt(plain_text, key):
# 将明文转换为数字序列
plain_text = [ord(c) - ord('a') for c in plain_text]
n = len(key)
# 将明文分组
plain_text = [plain_text[i:i+n] for i in range(0, len(plain_text), n)]
# 将密钥转换为矩阵
key_matrix = np.array([ord(c) - ord('a') for c in key]).reshape((n, n))
# 加密每个分组
cipher_text = []
for group in plain_text:
group = np.array(group + [0] * (n - len(group)))
# 将数字序列转换为列向量
group = group.reshape((-1, 1))
# 计算密文
cipher_group = key_matrix.dot(group) % 26
cipher_group = cipher_group.flatten().tolist()
# 将数字序列转换为字符序列
cipher_group = ''.join([chr(c + ord('a')) for c in cipher_group])
cipher_text.append(cipher_group)
# 将密文连接成一个字符串
return ''.join(cipher_text)
# 解密函数
def decrypt(cipher_text, key):
# 将密文转换为数字序列
cipher_text = [ord(c) - ord('a') for c in cipher_text]
n = len(key)
# 将密文分组
cipher_text = [cipher_text[i:i+n] for i in range(0, len(cipher_text), n)]
# 将密钥转换为矩阵
key_matrix = np.array([ord(c) - ord('a') for c in key]).reshape((n, n))
# 计算矩阵的逆
det = int(np.round(np.linalg.det(key_matrix)))
inv_det = pow(det, -1, 26)
key_matrix = (inv_det * np.round(det * np.linalg.inv(key_matrix)).astype(int)) % 26
# 解密每个分组
plain_text = []
for group in cipher_text:
group = np.array(group + [0] * (n - len(group)))
# 将数字序列转换为列向量
group = group.reshape((-1, 1))
# 计算明文
plain_group = key_matrix.dot(group) % 26
plain_group = plain_group.flatten().tolist()
# 将数字序列转换为字符序列
plain_group = ''.join([chr(c + ord('a')) for c in plain_group])
plain_text.append(plain_group)
# 将明文连接成一个字符串
return ''.join(plain_text)
# 主函数
def main():
# 获取明文或密文
text = input("请输入明文或密文:")
# 获取密钥
key = input("请输入密钥:")
# 加密或解密
if text.isalpha():
cipher_text = encrypt(text, key)
print("加密结果:", cipher_text)
else:
plain_text = decrypt(text, key)
print("解密结果:", plain_text)
if __name__ == '__main__':
main()
```
在这个示例中,我使用 int() 函数将浮点数转换为整数:
```
det = int(np.round(np.linalg.det(key_matrix)))
```
这个语句计算密钥矩阵的行列式,并将结果四舍五入并转换为整数。如果不进行转换,结果将是一个浮点数,无法用于 Hill 密码算法。
阅读全文