tuxuanjie 2025-02-15 10:02:17
乘法密码加密、解密
import string
import random
letter = string.ascii_lowercase + ''
def gcd(a, b):
smaller = min(a, b)
for i in range(smaller, 0, -1):
if a % i == 0 and b % i == 0:
return i
def encrypt(content):
lenght = len(letter)
keys = []
for i in range(2, lenght-1):
if gcd(i, lenght) == 1:
keys.append(i)
key = random.choice(keys)
ciphertext = ""
for char in content:
M_index = letter.index(char)
C_index = M_index * key % lenght
cipher_char = letter[C_index]
ciphertext += cipher_char
return ciphertext, key
def find_mod_inverse(K, N):
for i in range(1, N):
if K * i % N == 1:
return i
print("未获取")
return False
def decrypt(content, key):
lenght = len(letter)
key = find_mod_inverse(key, lenght)
decrypt_content = ""
for char in content:
C_index = letter.index(char)
M_index = (C_index * key) % lenght
decrypt_char = letter[M_index]
decrypt_content += decrypt_char
return decrypt_content, key
plaintext = input("加密内容:")
ciphertext, key = encrypt(plaintext)
print(f"加密前:{plaintext}")
print(f"加密后:{ciphertext}")
print(f"密钥:{key}")
ciphertext = input("解密内容:")
key = int(input("密钥:"))
decrypt_content, p_key = decrypt(ciphertext, key)
print(f"解密后:{decrypt_content}")
print(f"解密密钥:{p_key}")