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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
使用Python获取Linux系统的各种信息
Jul 10 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
python实现用户答题功能
Jan 17 Python
Python中sort和sorted函数代码解析
Jan 25 Python
python针对excel的操作技巧
Mar 13 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
django queryset 去重 .distinct()说明
May 19 Python
python3将变量输入的简单实例
Aug 19 Python
python实现Thrift服务端的方法
Apr 20 Python
pandas 实现将NaN转换为None
May 14 Python
Pytest中conftest.py的用法
Python实现8种常用抽样方法
Python基于百度API识别并提取图片中文字
Python基于百度AI实现抓取表情包
Python道路车道线检测的实现
浅析Django接口版本控制
浅析Python实现DFA算法
You might like
PHP函数microtime()用法与说明
2013/12/04 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
WebPack基础知识详解
2017/01/16 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
Python帮你识破双11的套路
2019/11/11 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
计算机专业个人求职自荐信
2013/09/21 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
大学生入党自荐书
2015/03/05 职场文书
开国大典观后感
2015/06/04 职场文书
师范生小学见习总结
2015/06/23 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
JavaScript获取URL参数的方法分享
2022/04/07 Javascript
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB