tuxuanjie 2025-02-15 10:02:17

乘法密码加密、解密

python python
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}")

评论

Home - Wiki
Copyright © 2011-2025 iteam. Current version is 2.142.0. UTC+08:00, 2025-02-19 13:43
浙ICP备14020137号-1 $Map of visitor$