import random def generate_random_text(length): # 生成随机明文 text = "" for i in range(length): text += chr(random.randint(ord('A'), ord('Z'))) return text def vigenere_cipher(text, key): # 将明文和密钥转换为大写字母 text = text.upper() key = key.upper() # 检查密钥是否合法 if not key.isalpha(): raise ValueError("密钥只能包含字母") # 初始化密文和密钥索引 cipher = "" key_index = 0 # 遍历明文中的每个字符 for char in text: if char.isalpha(): # 计算字符的偏移量 offset = ord(key[key_index]) - ord('A') key_index = (key_index + 1) % len(key) # 加密字符 if char.isupper(): cipher += chr((ord(char) - ord('A') + offset) % 26 + ord('A')) else: cipher += chr((ord(char) - ord('a') + offset) % 26 + ord('a')) else: # 不加密非字母字符 cipher += char return cipher # 生成随机明文并加密 text = generate_random_text(10) key = "SECRETKEY" cipher = vigenere_cipher(text, key) # 输出明文和密文 print("明文:", text) print("密文:", cipher)
时间: 2024-02-14 12:16:04 浏览: 84
这是一个使用维吉尼亚密码对随机生成的明文进行加密的 Python 代码。维吉尼亚密码是一种多表密码,通过将明文中的每个字符与密钥中对应位置的字符进行加密,从而实现加密的过程。在这个代码中,先生成了一个长度为 10 的随机明文,然后使用 "SECRETKEY" 作为密钥对明文进行加密,最后输出明文和密文。
相关问题
pycharm维吉尼亚密码随机输入一段明文加密
可以使用Python的 `random` 模块生成随机的明文,然后对其进行维吉尼亚密码加密。以下是一个示例代码:
```python
import random
def generate_random_text(length):
# 生成随机明文
text = ""
for i in range(length):
text += chr(random.randint(65, 90))
return text
# 生成随机明文并加密
text = generate_random_text(10)
key = "SECRETKEY"
cipher = vigenere_cipher(text, key)
# 输出明文和密文
print("明文:", text)
print("密文:", cipher)
```
这段代码使用 `generate_random_text` 函数生成指定长度的随机明文,然后使用 `vigenere_cipher` 函数对其进行加密。最后输出明文和密文。你可以在PyCharm中运行此代码并观察输出结果。
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` 库,减少了硬编码。同时,函数中还增加了对明文和密文的过滤,只保留字母字符,避免了在加密和解密过程中出现非法字符的问题。
阅读全文