仿射密码加解密的实现流程

1. 流程图

flowchart TD
    A(开始)
    B(输入明文和密钥)
    C(加密)
    D(解密)
    E(输出结果)
    A-->B-->C-->D-->E

2. 步骤及代码实现

2.1. 输入明文和密钥

首先,我们需要向用户获取明文和密钥,可以使用input函数实现。

plaintext = input("请输入明文:")
key = int(input("请输入密钥(整数):"))

2.2. 加密

在仿射密码中,加密的公式为:c = (a * p + b) % 26,其中c为密文,ab为密钥的参数,p为明文。

ciphertext = ""
for char in plaintext:
    if char.isalpha():  # 只对字母进行加密
        if char.isupper():
            p = ord(char) - ord('A')  # 将大写字母转换为0-25的数字
            c = (key * p) % 26  # 加密
            ciphertext += chr(c + ord('A'))  # 将加密后的数字转换为大写字母
        else:
            p = ord(char) - ord('a')  # 将小写字母转换为0-25的数字
            c = (key * p) % 26  # 加密
            ciphertext += chr(c + ord('a'))  # 将加密后的数字转换为小写字母
    else:
        ciphertext += char  # 非字母字符保持不变

2.3. 解密

解密的公式为:p = (a^-1 * (c - b)) % 26,其中p为明文,ab为密钥的参数,c为密文。

deciphertext = ""
for char in ciphertext:
    if char.isalpha():  # 只对字母进行解密
        if char.isupper():
            c = ord(char) - ord('A')  # 将大写字母转换为0-25的数字
            p = pow(key, -1, 26) * (c - ord('A') - b) % 26  # 解密
            deciphertext += chr(p + ord('A'))  # 将解密后的数字转换为大写字母
        else:
            c = ord(char) - ord('a')  # 将小写字母转换为0-25的数字
            p = pow(key, -1, 26) * (c - ord('a') - b) % 26  # 解密
            deciphertext += chr(p + ord('a'))  # 将解密后的数字转换为小写字母
    else:
        deciphertext += char  # 非字母字符保持不变

2.4. 输出结果

最后,我们将加密和解密后的结果输出。

print("加密结果:", ciphertext)
print("解密结果:", deciphertext)

3. 类图

classDiagram
    class AffineCipher {
        +encrypt(plaintext: str, key: int): str
        +decrypt(ciphertext: str, key: int): str
    }
    class Main {
        +run()
    }
    Main --> AffineCipher

4. 完整代码

class AffineCipher:
    @staticmethod
    def encrypt(plaintext: str, key: int) -> str:
        ciphertext = ""
        for char in plaintext:
            if char.isalpha():  # 只对字母进行加密
                if char.isupper():
                    p = ord(char) - ord('A')  # 将大写字母转换为0-25的数字
                    c = (key * p) % 26  # 加密
                    ciphertext += chr(c + ord('A'))  # 将加密后的数字转换为大写字母
                else:
                    p = ord(char) - ord('a')  # 将小写字母转换为0-25的数字
                    c = (key * p) % 26  # 加密
                    ciphertext += chr(c + ord('a'))  # 将加密后的数字转换为小写字母
            else:
                ciphertext += char  # 非字母字符保持不变
        return