实现古典密码中的仿射密码。要求用户自己输入明文密钥等参数实现仿射密码的加解密,算法能判定密钥参数的合法性。
- 设计思路
- 选择参数:用户输入两个参数,其中一个必须与26互质。
- 字符映射转换:对于明文中的每个字符,通过公式(a*x+b)%26转化为密文的字符,x为字符在26个字母表中的位置(0-25)
- 主函数
- 用户输入明文和密钥
- 检测参数是否符合条件
- 加密函数
- 解密函数
- 实验内容
def egcd(a, b):
if a == 0:
return(b, 0, 1)
else:
g, x, y = egcd(b % a, a)
return(g, y-(b//a)*x,x)
def modinv(a,m):
g,x,y = egcd(a,m)
if g!=1:
raise Exception("模逆不存在")
else:
return x % m
def affine_encrypt(text,key_a,key_b):
encrypted_text = ""
for char in text:
if char.isalpha():
if char.islower():
encrypted_text += chr(((ord(char)-ord('a'))*key_a+key_b)%26+ord("a"))
else:
encrypted_text += chr(((ord(char)-ord("A"))*key_a+key_b)%26+ord("A"))
else:
encrypted_text += char
return encrypted_text
def affine_decrypt(encrypted_text,key_a,key_b):
decrypted_text = ""
a_inv = modinv(key_a,26)
for char in encrypted_text:
if char.isalpha():
if char.islower():
decrypted_text += chr(((ord(char)-ord('a')-key_b)*a_inv)%26+ord('a'))
else:
decrypted_text += chr(((ord(char)-ord('A')-key_b)*a_inv)%26+ord('A'))
else:
decrypted_text += char
return decrypted_text
if __name__ == "__main__":
key_a = int(input("请输入参数a(与26互质)"))
key_b = int(input("请输入参数b"))
if key_a%2 == 0 or key_a%13 == 0:
print("参数a必须与26互质")
else:
plaintext = input("请输入明文")
encrypted_text = affine_encrypt(plaintext,key_a,key_b)
decrypted_text = affine_decrypt(encrypted_text,key_a,key_b)
print("加密后的密文为:", encrypted_text)
print("解密后的明文为:", decrypted_text)
3.实验结果