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


Posted in Python onJune 27, 2021

前言

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

一、移位密码

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) #测试函数正确性

三、全部代码

移位密码

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

仿射变换

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

# 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 相关文章推荐
python 将字符串转换成字典dict
Mar 24 Python
python进阶教程之模块(module)介绍
Aug 30 Python
Python线程中对join方法的运用的教程
Apr 09 Python
python显示生日是星期几的方法
May 27 Python
Python基于matplotlib绘制栈式直方图的方法示例
Aug 09 Python
Python基于socket实现简单的即时通讯功能示例
Jan 16 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
python实现linux下抓包并存库功能
Jul 18 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
Pytest中conftest.py的用法
Python实现8种常用抽样方法
Python基于百度API识别并提取图片中文字
Python基于百度AI实现抓取表情包
Python道路车道线检测的实现
浅析Django接口版本控制
浅析Python实现DFA算法
You might like
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
繁简字转换功能
2006/07/19 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
python dict.get()和dict['key']的区别详解
2016/06/30 Python
python实现简单图书管理系统
2019/11/22 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
Linux文件系统类型
2012/02/15 面试题
为什么要做架构设计
2015/07/08 面试题
办公室年终个人自我评价
2013/10/28 职场文书
生日宴会主持词
2014/03/20 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
平面设计师岗位职责
2014/09/18 职场文书
开学第一天的感想
2015/08/10 职场文书
交通安全学习心得体会
2016/01/18 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python