仿射密码加解密的实现流程
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
为密文,a
和b
为密钥的参数,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
为明文,a
和b
为密钥的参数,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