python实现仿射密码(26个字母+数字0~9)

古典密码

仿射密码

加密变换: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()

猜你喜欢

转载自blog.csdn.net/qq_43665434/article/details/109703756