134 lines
3.0 KiB
Python
134 lines
3.0 KiB
Python
"""
|
|
单表替换密码 (Monoalphabetic Cipher)
|
|
实现字母表的随机替换加密
|
|
"""
|
|
|
|
import random
|
|
import string
|
|
|
|
|
|
def generate_key():
|
|
"""
|
|
生成随机替换密钥
|
|
返回: 字典,包含字母到替换字母的映射
|
|
"""
|
|
alphabet = list(string.ascii_uppercase)
|
|
shuffled = alphabet.copy()
|
|
random.shuffle(shuffled)
|
|
|
|
key = {}
|
|
for i, char in enumerate(alphabet):
|
|
key[char] = shuffled[i]
|
|
key[char.lower()] = shuffled[i].lower()
|
|
|
|
return key
|
|
|
|
|
|
def monoalphabetic_encrypt(text, key):
|
|
"""
|
|
单表替换加密
|
|
|
|
Args:
|
|
text: 要加密的文本
|
|
key: 替换密钥字典
|
|
|
|
Returns:
|
|
加密后的文本
|
|
"""
|
|
encrypted_text = ""
|
|
|
|
for char in text:
|
|
if char in key:
|
|
encrypted_text += key[char]
|
|
else:
|
|
encrypted_text += char
|
|
|
|
return encrypted_text
|
|
|
|
|
|
def monoalphabetic_decrypt(text, key):
|
|
"""
|
|
单表替换解密
|
|
|
|
Args:
|
|
text: 要解密的文本
|
|
key: 替换密钥字典
|
|
|
|
Returns:
|
|
解密后的文本
|
|
"""
|
|
# 创建反向密钥
|
|
reverse_key = {v: k for k, v in key.items()}
|
|
|
|
decrypted_text = ""
|
|
|
|
for char in text:
|
|
if char in reverse_key:
|
|
decrypted_text += reverse_key[char]
|
|
else:
|
|
decrypted_text += char
|
|
|
|
return decrypted_text
|
|
|
|
|
|
def display_key(key):
|
|
"""
|
|
显示替换密钥表
|
|
|
|
Args:
|
|
key: 替换密钥字典
|
|
"""
|
|
# 构建密文字母表
|
|
plain_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
cipher_alphabet = ''.join([key[char] for char in plain_alphabet])
|
|
|
|
print("替换密钥表:")
|
|
print(f"明文字母表: {plain_alphabet}")
|
|
print(f"密文字母表: {cipher_alphabet}")
|
|
print()
|
|
|
|
|
|
def main():
|
|
"""主函数 - 交互式界面"""
|
|
print("=" * 50)
|
|
print("单表替换密码 (Monoalphabetic Cipher)")
|
|
print("=" * 50)
|
|
|
|
# 生成密钥
|
|
key = generate_key()
|
|
display_key(key)
|
|
|
|
while True:
|
|
print("\n选择操作:")
|
|
print("1. 加密")
|
|
print("2. 解密")
|
|
print("3. 重新生成密钥")
|
|
print("4. 退出")
|
|
|
|
choice = input("请输入选择 (1-4): ").strip()
|
|
|
|
if choice == "1":
|
|
text = input("明文: ")
|
|
result = monoalphabetic_encrypt(text, key)
|
|
print(f"密文: {result}")
|
|
|
|
elif choice == "2":
|
|
text = input("密文: ")
|
|
result = monoalphabetic_decrypt(text, key)
|
|
print(f"明文: {result}")
|
|
|
|
elif choice == "3":
|
|
key = generate_key()
|
|
display_key(key)
|
|
print("已重新生成密钥")
|
|
|
|
elif choice == "4":
|
|
print("再见!")
|
|
break
|
|
|
|
else:
|
|
print("无效选择,请重新输入!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |