• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python移位密码、仿射变换解密实例代码

    前言

    这个代码是很久之前的,已经忘记具体的思路了,你可以结合此文章来了解两个加密方式的内容。
    前两个步骤是对应加密方式的函数,第三个步骤是整合。

    一、移位密码

    def yiwei(string,number):
        '''
        将字符串的每个字母,向右移动指定的位数,并返回移动后的字符串
        如:A 向右移动3位,返回值为D
        string为字符串,number为整型
        A的ASCII码为65
        '''
        new_string = ""
        string = string.upper()  #转换为大写
        for i in string:        #移位操作
            #转换为ascii码后,经过移位变为新的ascii,再转换回字母
            new_string += chr((ord(i)-65+number)%26+65) 
        return new_string
    ##print(yiwei('AAA',3)) #测试函数正确性
    
    def yiwei_decode(c):
        '''移位密码解密,并打印解密的结果'''
        for i in range(1,27): #穷尽密钥搜索,遍历范围[1,26]
            print(yiwei(c,i))
        print("解密结束")
    ##yiwei_decode("A") #测试函数正确性
    

    二、仿射变换

    def fangshe_key(m,c):
        '''
        通过已知的两对明文密文,求解得到两个密钥
        m为明文,c为密文
        [A-Z]转换为数字为[0-25]
        '''
        #大写
        m = m.upper()
        c = c.upper()
        #切片
        m1 = m[:1:]     #明文的第一个字母
        m2 = m[-1::]    #明文的最后一个字母
        c1 = c[:1:]     #密文的第一个字母
        c2 = c[-1::]    #密文的最后一个字母
    ##    print(m1,m2)
    ##    print(c1,c2)
        #转换为整数
        m1 = ord(m1)-65
        m2 = ord(m2)-65
        c1 = ord(c1)-65
        c2 = ord(c2)-65
    ##    print(m1,m2)
    ##    print(c1,c2)
        #穷举法
        for i in range(0,26):
            for j in range(0,26):
                if (m1*i+j)%26==c1 and (m2*i+j)%26==c2: #同时满足加密算法时
                    return i,j
        return False
    ##print(fangshe_key("IF","ED")) #测试函数正确性
    
    def fangshe_reverse(x,y):
        '''
        计算乘法逆元,求解x^-1(%y)的乘法逆元,并返回对应值
        '''
        i = 0
        while True:
            if x*i%26==1: #符合乘法逆元条件时
                return i
            i += 1
    ##print(fangshe_reverse(9,26)) #测试函数正确性
    
    def fangshe_decode(c,a,b):
        '''
        仿射变换解密,并打印解密的结果
        c为密文,a和b为密钥
        0=a,b=25,且满足gcd(a,26)=1,a^-1表示a的逆元
        加密公式:c = a*m + b%26
        解密公式:m = (a^-1)*(c-b)%26
        '''
        new_string = ''
        c = c.upper() #大写转换
        for i in c: #逐个字母解密
            new_i = ord(i)-65 #转换成数字
            new_i = (fangshe_reverse(a,26)*(new_i - b))%26 #解密
            new_string += chr(new_i + 65) #转换回大写字母
        print(new_string)
        print("解密结束")
    ##fangshe_decode("ED",9,10) #测试函数正确性
    

    三、全部代码

    移位密码

    仿射变换



    # coding=utf-8
    # 作者:小狐狸FM
    # 题目:古典密码
    def menu():
        '''
        菜单界面
        '''
        print("-----------------------")
        print("|    0. 退出          |")
        print("|    1. 移位密码解密  |")
        print("|    2. 仿射变换解密  |")
        print("-----------------------")
    ##menu() #测试函数
    
    def yiwei(string,number):
        '''
        将字符串的每个字母,向右移动指定的位数,并返回移动后的字符串
        如:A 向右移动3位,返回值为D
        string为字符串,number为整型
        A的ASCII码为65
        '''
        new_string = ""
        string = string.upper()  #转换为大写
        for i in string:        #移位操作
            #转换为ascii码后,经过移位变为新的ascii,再转换回字母
            new_string += chr((ord(i)-65+number)%26+65) 
        return new_string
    ##print(yiwei('AAA',3)) #测试函数正确性
    
    def yiwei_decode(c):
        '''移位密码解密,并打印解密的结果'''
        for i in range(1,27): #穷尽密钥搜索,遍历范围[1,26]
            print(yiwei(c,i))
        print("解密结束")
    ##yiwei_decode("A") #测试函数正确性
    
    def fangshe_key(m,c):
        '''
        通过已知的两对明文密文,求解得到两个密钥
        m为明文,c为密文
        [A-Z]转换为数字为[0-25]
        '''
        #大写
        m = m.upper()
        c = c.upper()
        #切片
        m1 = m[:1:]     #明文的第一个字母
        m2 = m[-1::]    #明文的最后一个字母
        c1 = c[:1:]     #密文的第一个字母
        c2 = c[-1::]    #密文的最后一个字母
    ##    print(m1,m2)
    ##    print(c1,c2)
        #转换为整数
        m1 = ord(m1)-65
        m2 = ord(m2)-65
        c1 = ord(c1)-65
        c2 = ord(c2)-65
    ##    print(m1,m2)
    ##    print(c1,c2)
        #穷举法
        for i in range(0,26):
            for j in range(0,26):
                if (m1*i+j)%26==c1 and (m2*i+j)%26==c2: #同时满足加密算法时
                    return i,j
        return False
    ##print(fangshe_key("IF","ED")) #测试函数正确性
    
    def fangshe_reverse(x,y):
        '''
        计算乘法逆元,求解x^-1(%y)的乘法逆元,并返回对应值
        '''
        i = 0
        while True:
            if x*i%26==1: #符合乘法逆元条件时
                return i
            i += 1
    ##print(fangshe_reverse(9,26)) #测试函数正确性
    
    def fangshe_decode(c,a,b):
        '''
        仿射变换解密,并打印解密的结果
        c为密文,a和b为密钥
        0=a,b=25,且满足gcd(a,26)=1,a^-1表示a的逆元
        加密公式:c = a*m + b%26
        解密公式:m = (a^-1)*(c-b)%26
        '''
        new_string = ''
        c = c.upper() #大写转换
        for i in c: #逐个字母解密
            new_i = ord(i)-65 #转换成数字
            new_i = (fangshe_reverse(a,26)*(new_i - b))%26 #解密
            new_string += chr(new_i + 65) #转换回大写字母
        print(new_string)
        print("解密结束")
    ##fangshe_decode("ED",9,10) #测试函数正确性
        
    
    if __name__=='__main__':
        while True:
            menu()
            choose = int(input("请选择: "))
            if choose==1:   
                string = input("请输入密文: ")
                yiwei_decode(string)
            elif choose==2:            
                string = input("请输入密文: ")
                m = input("已知明文:")
                c = input("对应密文:")
                a,b = fangshe_key(m,c)
                fangshe_decode(string,a,b)
            else:
                break
    
    
    

    总结

    到此这篇关于Python移位密码、仿射变换解密的文章就介绍到这了,更多相关Python移位密码仿射变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python序列循环移位的3种方法推荐
    • python的移位操作实现详解
    • python移位运算的实现
    • python实现整数的二进制循环移位
    • python实现移位加密和解密
    • 详解Python计算机视觉 图像扭曲(仿射扭曲)
    • 基于Python解密仿射密码
    • Python实现仿射密码的思路详解
    上一篇:Pytest中conftest.py的用法
    下一篇:python用函数创造字典的实例讲解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python移位密码、仿射变换解密实例代码 Python,移位,密码,仿射,变换,