IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python利用扩展欧几里得算法求乘法逆元 以及 实现仿射密码加解密 -> 正文阅读

[Python知识库]python利用扩展欧几里得算法求乘法逆元 以及 实现仿射密码加解密

扩展欧几里得算法求乘法逆元

扩展的欧几里德算法可用于求解a mod b的逆元,而逆元求解在RSA加密算法中是不可缺少的一步

伪代码如下:
在这里插入图片描述

def fangshe_reverse(a,b):
    X=[0,1]
    Y=[1,0]
    X.append(int(a))
    Y.append(int(b))
    def exgcd(X,Y):
        if Y[2] == 0:
            pass
            #print('gcd(a,b)= %d \n no inverse'%(a,b,Y[2]))
        elif Y[2] == 1:
            pass
            #print('gcd(a,b)=%d\n a mod b的逆元: %d'%(int(Y[2]),int(Y[1])))
        else:
            Q= X[2] // Y[2]
            T1,T2,T3 = [(X[0] - Q * Y[0]),(X[1] - Q * Y[1]),(X[2] - Q * Y[2])]
            X[0],X[1],X[2] = Y[0],Y[1],Y[2]
            Y[0],Y[1],Y[2] = T1,T2,T3
            exgcd(X,Y)
    exgcd(X,Y)
    return int(Y[1])
#fangshe_reverse(3,17)

仿射密码实现加解密

算法实现核心:

仿射变换加密,并打印加密的结果
    c为密文,a和b为密钥(0<=a,b<=25)
    加密公式:c = a*m + b%26
    
仿射变换解密,并打印解密的结果
    c为密文,a和b为密钥
    0<=a,b<=25,且满足gcd(a,26)=1,a^-1表示a的逆元
    解密公式:m = (a^-1)*(c-b)%26

实现代码:

# coding=utf-8
# author : rang

def menu():
    '''
    菜单
    '''
    print("-----------------------")
    print("|    0. 退出          |")
    print("|    1. 仿射加密  |")
    print("|    2. 仿射解密  |")
    print("-----------------------")

def gcd(a,b):
    #欧几里得算法求最大公约数
    if b == 0:
        return a
    else:
        return gcd(b , a % b)

def fangshe_reverse(a,b):
    X=[0,1]
    Y=[1,0]
    X.append(int(a))
    Y.append(int(b))
    def exgcd(X,Y):
        if Y[2] == 0:
            pass
            #print('gcd(a,b)= %d \n no inverse'%(a,b,Y[2]))
        elif Y[2] == 1:
            pass
            #print('gcd(a,b)=%d\n a mod b的逆元: %d'%(int(Y[2]),int(Y[1])))
        else:
            Q= X[2] // Y[2]
            T1,T2,T3 = [(X[0] - Q * Y[0]),(X[1] - Q * Y[1]),(X[2] - Q * Y[2])]
            X[0],X[1],X[2] = Y[0],Y[1],Y[2]
            Y[0],Y[1],Y[2] = T1,T2,T3
            exgcd(X,Y)
    exgcd(X,Y)
    return int(Y[1])
#fangshe_reverse(3,17)

def fangshe_encode(m,a,b):
    '''
    仿射变换加密,并打印加密的结果
    c为密文,a和b为密钥(0<=a,b<=25)
    加密公式:c = a*m + b%26
    '''
    c = ''
    for i in m:
        new_i = ord(i) - 97
        new_i =((a * new_i) + b ) % 26
        c += chr(new_i + 97)
    print("密文为:",c)     

def fangshe_decode(c,a,b):
    '''
    仿射变换解密,并打印解密的结果
    c为密文,a和b为密钥
    0<=a,b<=25,且满足gcd(a,26)=1,a^-1表示a的逆元
    解密公式:m = (a^-1)*(c-b)%26
    '''
    m = ''
    for i in c:
        new_i = ord(i) - 97
        #print(fangshe_reverse(a,26))
        new_i = (fangshe_reverse(a,26) * (int(new_i) - b)) % 26
        m += chr(new_i + 97)
    #print(m)
    print("明文为",m)

def input_a_b():
    a = int(input("请输入密钥a:"))
    while True:
        if gcd(a,26) != 1:
            print("密钥a与26不互素")
            a = int(input("请输入密钥a:"))
        else:
            break
    b = int(input("请输入密钥b:"))
    return a,b

if __name__=='__main__':
    while True:
        menu()
        choose = int(input("请选择: "))
        if choose == 1:
            m = input("请输入明文: ")
            a,b = input_a_b()
            fangshe_encode(m,a,b)
        elif choose == 2:            
            c = input("请输入密文: ")
            a,b = input_a_b()
            fangshe_decode(c,a,b)
        else:
            break

效果:
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:42:11  更:2021-09-09 11:42:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:00:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码