HILL2密码编译中一个针对简谱做密码的和针对拼音或者英文字母做密码有什么不一样的难点?
时间: 2023-05-27 11:05:40 浏览: 70
针对简谱做密码和针对拼音或者英文字母做密码的难点有所不同。
对于针对简谱做密码,难点在于:
1. 简谱本身就是一种简化的音乐符号,其含义需要进行解释和理解,因此需要对简谱有一定的了解和熟悉程度。
2. 简谱中只包含了7个音符,对于较长的明文消息,需要对其进行分割和组合,以使之能够转化为简谱密码。
3. 简谱中还存在各种音符组合,例如连音符、跳音符等,需要进行转换和编码处理。
而针对拼音或者英文字母做密码的难点在于:
1. 拼音和英文字母本身就是常见的字母和音节组合,因此需要采用一些复杂的编码方式,以保证密码的安全性。
2. 拼音和英文字母中存在大量的重复元素,如字母“e”、音节“an”等,需要通过一些特殊的处理方式来避免密码的重复和预测性。
3. 拼音和英文字母的编码方式与语言和文化背景密切相关,因此需要对不同的语言和文化背景进行适当的调整和处理。
相关问题
pycharm hill密码随机输入一段明文加密或者密文解密
为了回答你的问题,我需要先了解一下 Hill 密码。Hill 密码是一种基于矩阵运算的对称密码,它将明文分成若干个数字组合,然后通过矩阵运算进行加密。因此,我们需要使用矩阵计算的工具来进行 Hill 密码的加密和解密。
下面是使用 Python 和 NumPy 库实现 Hill 密码的加密和解密的示例代码:
```python
import numpy as np
# 加密函数
def encrypt(plain_text, key):
# 将明文转换成数字向量
plain_text = [ord(c) - ord('a') for c in plain_text]
plain_text = np.array(plain_text)
# 将密钥转换成矩阵
key = np.array(key)
# 将数字向量按照密钥的大小分成若干个块
block_size = key.shape[0]
num_blocks = int(np.ceil(len(plain_text) / block_size))
plain_text = np.pad(plain_text, (0, num_blocks * block_size - len(plain_text)), 'constant')
plain_text = plain_text.reshape(-1, block_size)
# 对每个块进行加密
cipher_text = []
for block in plain_text:
cipher_block = np.mod(key @ block, 26)
cipher_text += cipher_block.tolist()
# 将密文转换成字符串
cipher_text = ''.join([chr(c + ord('a')) for c in cipher_text])
return cipher_text
# 解密函数
def decrypt(cipher_text, key):
# 将密文转换成数字向量
cipher_text = [ord(c) - ord('a') for c in cipher_text]
cipher_text = np.array(cipher_text)
# 将密钥转换成矩阵
key = np.array(key)
# 将数字向量按照密钥的大小分成若干个块
block_size = key.shape[0]
num_blocks = int(np.ceil(len(cipher_text) / block_size))
cipher_text = np.pad(cipher_text, (0, num_blocks * block_size - len(cipher_text)), 'constant')
cipher_text = cipher_text.reshape(-1, block_size)
# 对每个块进行解密
plain_text = []
for block in cipher_text:
# 计算矩阵的逆
det = np.linalg.det(key)
inv_key = np.mod(np.round(det * np.linalg.inv(key)), 26)
plain_block = np.mod(inv_key @ block, 26)
plain_text += plain_block.tolist()
# 将明文转换成字符串
plain_text = ''.join([chr(c + ord('a')) for c in plain_text])
return plain_text
# 测试代码
key = [[3, 10], [20, 9]]
plain_text = 'hello'
cipher_text = encrypt(plain_text, key)
print(cipher_text)
plain_text = decrypt(cipher_text, key)
print(plain_text)
```
在这个示例中,我们定义了两个函数 `encrypt` 和 `decrypt` 分别实现了 Hill 密码的加密和解密。函数的参数 `plain_text` 表示明文字符串,`cipher_text` 表示密文字符串,`key` 表示 Hill 密钥矩阵。在加密和解密函数中,我们都采用了相同的方式把明文或密文分成若干个块,并对每个块进行加密或解密。
pycharm代码改进 hill密码随机输入一段明文加密或者密文解密
以下是改进后的 Hill 密码加密和解密代码:
```python
import numpy as np
# 加密函数
def hill_encrypt(plain_text, key):
# 将明文转换成数字向量
plain_text = [ord(c) - ord('a') for c in plain_text.lower() if c.isalpha()]
plain_text = np.array(plain_text)
# 将密钥转换成矩阵
key = np.array(key)
# 将数字向量按照密钥的大小分成若干个块
block_size = key.shape[0]
num_blocks = int(np.ceil(len(plain_text) / block_size))
plain_text = np.pad(plain_text, (0, num_blocks * block_size - len(plain_text)), 'constant')
plain_text = plain_text.reshape(-1, block_size)
# 对每个块进行加密
cipher_text = []
for block in plain_text:
cipher_block = np.mod(key @ block, 26)
cipher_text += cipher_block.tolist()
# 将密文转换成字符串
cipher_text = ''.join([chr(c + ord('a')) for c in cipher_text])
return cipher_text
# 解密函数
def hill_decrypt(cipher_text, key):
# 将密文转换成数字向量
cipher_text = [ord(c) - ord('a') for c in cipher_text.lower() if c.isalpha()]
cipher_text = np.array(cipher_text)
# 将密钥转换成矩阵
key = np.array(key)
# 将数字向量按照密钥的大小分成若干个块
block_size = key.shape[0]
num_blocks = int(np.ceil(len(cipher_text) / block_size))
cipher_text = np.pad(cipher_text, (0, num_blocks * block_size - len(cipher_text)), 'constant')
cipher_text = cipher_text.reshape(-1, block_size)
# 对每个块进行解密
plain_text = []
for block in cipher_text:
# 计算矩阵的逆
det = np.linalg.det(key)
inv_key = np.mod(np.round(det * np.linalg.inv(key)), 26)
plain_block = np.mod(inv_key @ block, 26)
plain_text += plain_block.tolist()
# 将明文转换成字符串
plain_text = ''.join([chr(c + ord('a')) for c in plain_text])
return plain_text
# 生成随机明文
def generate_random_text(length):
# 生成随机明文
text = ""
for i in range(length):
text += chr(np.random.randint(ord('a'), ord('z') + 1))
return text
# 生成随机密钥
def generate_random_key(size):
return np.random.randint(0, 26, (size, size))
# 测试代码
key = generate_random_key(2)
plain_text = generate_random_text(10)
cipher_text = hill_encrypt(plain_text, key)
decrypted_plain_text = hill_decrypt(cipher_text, key)
print("明文:", plain_text)
print("密钥:", key)
print("密文:", cipher_text)
print("解密后明文:", decrypted_plain_text)
```
改进后的代码增加了随机生成明文和密钥的函数 `generate_random_text` 和 `generate_random_key`,使用了 `np.random.randint` 函数代替了 Python 的 `random` 库,减少了硬编码。同时,函数中还增加了对明文和密文的过滤,只保留字母字符,避免了在加密和解密过程中出现非法字符的问题。