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

替换表:

01234567891011121314151617<-x
abcdefghijklmnopqr
181920212223242526272829303132333435<-x
stuvwxyz0123456789

基本思路:

将输入字符的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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值