古典密码
仿射密码
加密变换:E(x)=ax + b (mod m)
解密变换:D(x)=a-1(x-b) (mod m)
m=36 (其中包括26个字母(a到z)和10个数字(0到9))
ascii码:
a~z 97~122
0~9 48~57
替换表:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | <-x |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <-x |
s | t | u | v | w | x | y | z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
基本思路:
将输入字符的ASCII码转换为替换表中对应的序号x,带入上述加解密变换公式,计算出后的值再转化为对应的ASCII码,最后输出结果。
a=int(input("输入a:"))
b=int(input("输入b:"))
dic = {1: 1, 5: 29, 7: 31, 11: 23, 13: 25, 17: 17, 19: 19, 23: 11, 25: 13, 29: 5, 31: 7, 35: 35}
#dic[] a的逆元,a与36互素
def Encrypt():
m=input("请输入明文:")
k=m.lower()
l=list(k)
s=l
t={}
for i in range(len(l)):
if 97<=ord(l[i])<=122: #如果明文是字母,则执行如下操作
t[i]=((ord(l[i])-97)*a+b)%36 #计算出密文对应置换表里的序号
if 0<=t[i]<=25:
s[i]=chr(t[i]+97) #如果序号在0~25,则直接置换为字母
elif 26<=t[i]<=35:
s[i]=chr(t[i]+22) #如果序号在26~35,则置换为数字
elif 48<=ord(l[i])<=57: #如果明文是数字,则执行如下操作
t[i]=((ord(l[i])-48+26)*a+b)%36
if 0<=t[i]<=25:
s[i]=chr(t[i]+97) #如果序号在0~25,则直接置换为字母
elif 26<=t[i]<=35:
s[i]=chr(t[i]+22) #如果序号在26~35,则置换为数字
print("结果为:"+"".join(s))
def Decrypt():
c=input("请输入密文:")
k=c.lower()
l=list(k)
s=l
t={}
for i in range(len(l)):
if 97<=ord(l[i])<=122:
t[i]=(dic[a]*(ord(l[i])-97)-(dic[a]*b))%36
if 0<=t[i]<=25:
s[i]=chr(t[i]+97) #如果序号在0~25,则直接置换为字母
elif 26<=t[i]<=35:
s[i]=chr(t[i]+22) #如果序号在26~35,则置换为数字
elif 26<=ord(l[i])<=57:
t[i]=(dic[a]*(ord(l[i])-48+26)-(dic[a]*b)%36)%36
if 0<=t[i]<=25:
s[i]=chr(t[i]+97) #如果序号在0~25,则直接置换为字母
elif 26<=t[i]<=35:
s[i]=chr(t[i]+22) #如果序号在26~35,则置换为数字
print("结果为:"+"".join(s))
while True:
Encrypt()
Decrypt()