密码加密解密(二)——凯撒密码

'''
         凯撒编码解码模块
         @author Liao
         @time  2020-1-19
'''
class kaisa:
    '''
        decodekaisa:解密函数
        encodekaisa:加密函数
    '''
    def encodekaisa(self,plaintext="",key=1):
        '''
        对字符加密
        :param plaintext:需要加密的字符串
        :param key:移位值
        :return:返回加密后的字符串
        '''
        string=""
        for i in range(len(plaintext)):
            if plaintext[i].__eq__(" "):
                string+=" "
            elif ord(plaintext[i])>=65 and ord(plaintext[i])<=90:
                if ord(plaintext[i])+key>90:
                    string+=chr(ord(plaintext[i])+key-26)
                elif ord(plaintext[i])+key<65:
                    string+=chr(ord(plaintext[i])+key+26)
                else:
                    string+=chr(ord(plaintext[i])+key)
            elif ord(plaintext[i])>=97 and ord(plaintext[i])<=122:
                if ord(plaintext[i])+key>122:
                    string+=chr(ord(plaintext[i])+key-26)
                elif ord(plaintext[i])+key<97:
                    string+=chr(ord(plaintext[i])+key+26)
                else:
                    string+=chr(ord(plaintext[i])+key)
            else:
                string="error plaintext!"
                break
        self.Output("加密结果:"+string)

    def decodekaisa(self,kaisacode,mode=0,key=1):
        '''
        对字符串进行解密
        :param kaisacode:需要解密的字符串
        :param mode:解密模式,0表示暴力破解,1表示密匙解密
        :param key:密匙解密移位值
        :return:返回解密后的明文
        '''
        string=""
        if mode==0:#暴力破解
            self.Output("暴力破解结果:")
            for key in range(26):
                for sign in kaisacode:
                    if sign.__eq__(" "):
                        string+=" "
                    elif ord(sign)>=65 and ord(sign)<=90:
                        if ord(sign) - key > 90:
                            string += chr(ord(sign) - key - 26)
                        elif ord(sign) - key < 65:
                            string += chr(ord(sign) - key + 26)
                        else:
                            string += chr(ord(sign) - key)
                    elif ord(sign) >= 97 and ord(sign) <= 122:
                        if ord(sign) - key > 122:
                            string += chr(ord(sign) - key - 26)
                        elif ord(sign) - key < 97:
                            string += chr(ord(sign) - key + 26)
                        else:
                            string += chr(ord(sign) - key)
                    else:
                        string = "error plaintext!"
                        break
                self.Output(string)
                string = ""
        elif mode==1:#密匙破解
            for sign in kaisacode:
                if sign.__eq__(" "):
                    string += " "
                elif ord(sign) >= 65 and ord(sign) <= 90:
                    if ord(sign) - key > 90:
                        string += chr(ord(sign) - key - 26)
                    elif ord(sign) - key < 65:
                        string += chr(ord(sign) - key + 26)
                    else:
                        string += chr(ord(sign) - key)
                elif ord(sign) >= 97 and ord(sign) <= 122:
                    if ord(sign) - key > 122:
                        string += chr(ord(sign) - key - 26)
                    elif ord(sign) - key < 97:
                        string += chr(ord(sign) - key + 26)
                    else:
                        string += chr(ord(sign) - key)
                else:
                    string = "error plaintext!"
                    break
            self.Output("密匙破解结果:"+string)
        else:
            self.Output("error mode")

    def Output(self,string):
        '''
        输出字符串
        :param string: 需要输出的字符串
        :return:
        '''
        print(string)

if __name__=="__main__":
    ka=kaisa()
    ka.encodekaisa("I love you",4)
    ka.decodekaisa("M pszi csy",1,4)
    ka.decodekaisa("M pszi csy")

代码有点冗余,还可以改进。
区分了大小写字母。
可以将需要加密的字符串统一转换成大写或小写,然后输出的时候可以通过选择来输出大小写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值