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使用redis pool的一种单例实现方式
Apr 16 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
django最快程序开发流程详解
Jul 19 Python
django做form表单的数据验证过程详解
Jul 26 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
Pytest中conftest.py的用法
Python实现8种常用抽样方法
Python基于百度API识别并提取图片中文字
Python基于百度AI实现抓取表情包
Python道路车道线检测的实现
浅析Django接口版本控制
浅析Python实现DFA算法
You might like
Windows下的PHP5.0详解
2006/11/18 PHP
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
PHP 5.0对象模型深度探索之对象复制
2008/03/27 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
浅谈PHP中的
2016/04/23 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Python单元测试与测试用例简析
2019/11/09 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
知识竞赛活动方案
2014/02/18 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
合理化建议书范文
2015/09/14 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
html粘性页脚的具体使用
2022/01/18 HTML / CSS