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 相关文章推荐
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
opencv python 傅里叶变换的使用
Jul 21 Python
Python读取txt某几列绘图的方法
Oct 14 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
Python Pandas数据结构简单介绍
Jul 03 Python
浅析PEP572: 海象运算符
Oct 15 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
pandas dataframe 中的explode函数用法详解
May 18 Python
python实现学生成绩测评系统
Jun 22 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 Python
Pytest中conftest.py的用法
Python实现8种常用抽样方法
Python基于百度API识别并提取图片中文字
Python基于百度AI实现抓取表情包
Python道路车道线检测的实现
浅析Django接口版本控制
浅析Python实现DFA算法
You might like
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
代码生成器 document.write()
2007/04/15 Javascript
IE8 原生JSON支持
2009/04/13 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
python 读入多行数据的实例
2018/04/19 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
详解Python实现进度条的4种方式
2020/01/15 Python
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
C语言笔试集
2012/07/24 面试题
英文简历中的自我评价用语
2013/12/09 职场文书
聘用意向书
2014/07/29 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
南京导游词
2015/02/03 职场文书
幼师个人总结范文
2015/02/28 职场文书
国家助学贷款承诺书
2015/04/30 职场文书