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使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
Django中模型Model添加JSON类型字段的方法
Jun 17 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
python爬虫中多线程的使用详解
Sep 23 Python
PyCharm第一次安装及使用教程
Jan 08 Python
pytorch梯度剪裁方式
Feb 04 Python
Tensorflow分批量读取数据教程
Feb 07 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Pytest中conftest.py的用法
Python实现8种常用抽样方法
Python基于百度API识别并提取图片中文字
Python基于百度AI实现抓取表情包
Python道路车道线检测的实现
浅析Django接口版本控制
浅析Python实现DFA算法
You might like
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
python处理大数字的方法
2015/05/27 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
python安装pil库方法及代码
2019/06/25 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
基于python实现模拟数据结构模型
2020/06/12 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
股份转让协议书
2014/04/12 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
综治工作汇报材料
2014/10/27 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
班主任自我评价范文
2015/03/11 职场文书
新年祝酒词大全
2015/08/11 职场文书
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏