实例 | Python 实现 RSA 加解密

大家好,欢迎来到编程教室 !

前阵子看到一篇英文文章[1],展示了如何用 Python 来实现 RSA 算法。不太熟悉 RSA 的朋友可以看一下一文搞懂 RSA 算法,里面对什么是 RSA,RSA 的数学原理进行了说明,并举了一个简单的例子,是非常易懂的 RSA 文章。

运行了下这篇英文提供的代码,发现不能加密中文,于是就修改了下加解密的函数,让其支持中文加解密。今天的文章就分享一下如何用 Python 来实现 RSA 加解密的这一过程,帮助你建立 RSA 的直观认识,代码里的随机素数生成算法,也值得我们学习。

0、效果演示

咱们先看下效果。

原文:“有内鬼,终止交易”

密文,根本无法破解:

解密之后:

1、密钥对的生成

思路:

1)随机找两个质数(素数) p 和 q,p 与 q 越大,越安全,这里选择 1024 位的质数:

p = genprime(1024)   q = genprime(1024)   

genprime() 函数的实现过程先不说。

2)计算他们的乘积 n = p * q 及 欧拉函数 lambda_n。

n = p * q   lambda_n = (p - 1) * (q - 1)   

3)随机选择一个整数 e,条件是 1 < e < lambda_n,且 e 与 lambda_n 互质。比如选择 35537,35537 只有 16 位,必然小于 lambda_n。

e = 35537   

4)找到一个整数 d,可以使得 e * d 除以 lambda_n 的余数为 1,并返回密钥对。

d = eucalg(e, lambda_n)[0]   if d < 0: d += lambda_n   return (d, n), (e, n)   

eucalg 函数的实现放后面说。

至此,密钥对的生成的函数如下:

def create_keys():    p = genprime(1024)    q = genprime(1024)    n = p * q    lambda_n = (p - 1) * (q - 1)    e = 35537    d = eucalg(e, lambda_n)[0]    if d < 0: d += lambda_n    return (d, n), (e, n)   

2、加解密的实现

加密和解密的过程是一样的,公钥加密,私钥解密,反过来也可以,私钥加密,公钥解密,只不过前者我们叫加密,后者我们叫签名。

具体的函数实现如下:

    def encrypt_data(data,key):       e_data = []       for d in data:          e = modpow(d, key[0], key[1])           e_data.append(e)       return e_data      ## 加密和解密的逻辑完全一样   decrypt_data = encrypt_data    

这里面用到了 modpow 函数,它用来计算公式 b^e % n = r 的。

  • 如果是加密过程,那么 b 是明文,(n,e)为公钥,r 为密文。

  • 如果是解密过程,那么 b 是密文,(n,d)为私钥,r 为名文。

modpow 的定义如下:

def modpow(b, e, n):    # find length of e in bits    tst = 1    siz = 0    while e >= tst:     tst <<= 1     siz += 1    siz -= 1    # calculate the result    r = 1    for i in range(siz, -1, -1):     r = (r * r) % n     if (e >> i) & 1: r = (r * b) % n    return r   

3、随机质数的生成函数

随机质数的生成函数,其中用到了矩阵乘法和斐波那契数列,可见数学对于算法的重要性。

# matrix multiplication   def sqmatrixmul(m1, m2, w, mod):    mr = [[0 for j in range(w)] for i in range(w)]    for i in range(w):     for j in range(w):      for k in range(w):       mr[i][j] = (mr[i][j] + m1[i][k] * m2[k][j]) % mod    return mr      # fibonacci calculator   def fib(x, mod):    if x < 3: return 1    x -= 2    # find length of e in bits    tst = 1    siz = 0    while x >= tst:     tst <<= 1     siz += 1    siz -= 1    # calculate the matrix    fm = [     # function matrix     [0, 1],     [1, 1]    ]    rm = [     # result matrix     # (identity)     [1, 0],     [0, 1]    ]    for i in range(siz, -1, -1):     rm = sqmatrixmul(rm, rm, 2, mod)     if (x >> i) & 1:      rm = sqmatrixmul(rm, fm, 2, mod)       # second row of resulting vector is result    return (rm[1][0] + rm[1][1]) % mod      def genprime(siz):    while True:     num = (1 << (siz - 1)) + secrets.randbits(siz - 1) - 10;     # num must be 3 or 7 (mod 10)     num -= num % 10     num += 3 # 3 (mod 10)     # heuristic test     if modpow(2, num - 1, num) == 1 and fib(num + 1, num) == 0:      return num     num += 5 # 7 (mod 10)     # heuristic test     if modpow(2, num - 1, num) == 1 and fib(num + 1, num) == 0:      return num   

4、eucalg 函数的实现

函数的本质在于求下面二元一次方程的解:

e * x - lambda_n * y =1   

具体代码:

def eucalg(a, b):    # make a the bigger one and b the lesser one    swapped = False    if a < b:     a, b = b, a     swapped = True    # ca and cb store current a and b in form of    # coefficients with initial a and b    # a' = ca[0] * a + ca[1] * b    # b' = cb[0] * a + cb[1] * b    ca = (1, 0)    cb = (0, 1)    while b != 0:     # k denotes how many times number b     # can be substracted from a     k = a // b     # swap a and b so b is always the lesser one     a, b, ca, cb = b, a-b*k, cb, (ca[0]-k*cb[0], ca[1]-k*cb[1])    if swapped:     return (ca[1], ca[0])    else:     return ca      

5、测试

test.py 脚本使用方法:

1、生成密钥

python test.py make-keys rsakey   

公钥保存在 rsakey.pub 中, 私钥保存在 rsakey.priv 中

2、对文件内容加密

假如有文件 明文.txt:

python test.py encrypt 明文.txt from rsakey to 密文.txt   

将生成 密文.txt

3、 对文件内容解密

假如有文件 密文.txt:

python test.py decrypt 密文.txt as rsakey to 解密后.txt   

将生成 解密后.txt

6、总结

本文分享了 RSA 算法的 Python 的简单实现,可以帮助理解 RSA 算法,完整代码:

https://gitee.com/somenzz/code-example/tree/master/rsa

参考资料

[1]

英文文章: https://coderoasis.com/implementing-rsa-in-python-from-scratch-part-2/

作者:somenzz

来源:Python七号


---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTreeCtrl自绘

CSWTreeCtrl.h&#xff09; #pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl&#xff0c;可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl {DECLARE_DYNAMIC(CSWTreeCtrl)// 成员私有结构定义// 构造/析构函数 public:CSWTreeCtrl();virtual ~CSWTreeC…

pip和conda的环境管理,二者到底应该如何使用

关于pip与conda是否能混用的问题&#xff0c;Anaconda官方早就给出了回答 先说结论&#xff0c;如果conda和pip在相同环境下掺杂使用&#xff0c;尤其是频繁使用这两个工具进行包的安装&#xff0c;可能会导致环境状态混乱 就像其他包管理器一样&#xff0c;大部分这些问题均…

提升你的Android开发技能:从AR/VR沉浸到UI设计和故障排除

文章目录 探索最新AR/VR应用在教育、游戏、医疗等领域的应用教育领域游戏领域医疗领域 深入了解Android内存管理与性能优化的方法与技巧垃圾回收机制内存泄漏使用弱引用避免过度渲染内存优化图像优化延迟加载Android中的调试技术应用程序分析 分享如何提高Android应用的易用性和…

Leetcode算法入门与数组丨1. 数据结构与算法简介

文章目录 前言1 数据结构与算法1.1 数据结构1.2 算法 2 算法复杂度2.1 算法复杂度简介2.2 时间复杂度2.3 空间复杂度 3 总结 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客以及接下来几篇将会是一个 入门型 的文章&#xff0c;主要是自己学习的一个…

Java FTP按关键字批量下载文件

一、所需jar <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency> 二、工具类 import java.io.*; import java.net.URLConnection; import java.util.A…

032:vue中三元运算, style、class、type、 event等多种场景示例

第032个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

c++标准库的错误代码

cppreference的std::errc: std::errc - cppreference.com 对应定义(come from: 2022\Community\VC\Tools\MSVC\14.33.31629\include\xerrc.h) enum class errc { // names for generic error codesaddress_family_not_supported 102, // EAFNOSUPPORTaddress_in_use …

Hystrix Readed time out,看我这一篇就让你彻底解决!

在说这个问题的时候&#xff0c;作者真心想吐槽&#xff0c;由于作者在一个特殊的环境无法访问外网&#xff0c;所以用了度娘去查&#xff0c;发现搜索到的结果真的没啥用&#xff0c;有的根本就说不清为啥这么配置解决问题&#xff0c;有些简直的恶心一顿抄&#xff0c;有些连…

Python爬虫技术在SEO优化中的关键应用和最佳实践

大家好&#xff01;今天我要和大家分享一个关于SEO优化的秘密武器&#xff1a;Python爬虫技术。在这篇文章中&#xff0c;我们将探讨Python爬虫在SEO优化中的关键应用和最佳实践。无论您是一名SEO专家、网站管理员&#xff0c;还是对优化网站曝光度感兴趣的初学者&#xff0c;都…

《Effective Java》知识点(2)--对于所有对象都通用的方法

10. 覆盖equals时请遵守通用约定 10.1 不要轻易覆盖equals方法&#xff0c;除非迫不得已。因为&#xff1a; 10.1.1 类的每个实例本质上都是唯一的。 10.1.2 类没有必要提供”逻辑相等“的测试功能。 10.1.3 超类已经覆盖了equals&#xff0c;超类的行为对于这个类也是合适…

VR全景广告——实体商家的营销新选择

前几年&#xff0c;大家出行不便&#xff0c;那个时候实体商家整天苦恼于没有客户&#xff0c;没有销量&#xff0c;一直到引入VR全景广告才算是有所好转。随着VR全景技术不断完善&#xff0c;许多行业、领域开始结合VR全景&#xff0c;例如景区、房地产、车企等都会利用VR全景…

「程序员必须掌握的算法」双指针「上篇」

双指针&#xff08;Two Pointers&#xff09;是解决算法问题的常用方法之一&#xff0c;它通过维护两个指针在某个序列中游走来解决问题。最常见的双指针问题是在一个有序数组中查找是否存在两个数的和等于目标值。 具体来说&#xff0c;设一个指针 left 初始指向数组第一个元…

解决nexus3登录x509: certificate has expired or is not yet valid

笔者前面的博文使用nexus3作为Docker镜像仓库介绍了如何使用nexus3来作为容器的镜像仓库,在生成证书时,使用了有效期限。如果证书过期了,使用podman或者docker登录,则会提示类似如下的信息: x509: certificate has expired or is not yet valid: current time 2023-09-12…

CMS-织梦[dede]-通用免登发布插件

CMS-织梦[dede]-通用免登发布插件 1. 织梦通用免登陆发布插件功能说明2. 织梦通用免登陆发布接口使用说明2-1 下载插件2-2 安装插件3 对接火车头等采集工具 3 爬虫【古诗文网】示例[可选]测试火车头入库模型 使用火车头&#xff0c;简数采集器&#xff0c;八爪鱼等文章采集工具…

构造函数注入指定bean名称

配置类 Configuration public class ThreadPoolTaskExecutorConfig {Beanpublic ThreadPoolTaskScheduler syncScheduler() {ThreadPoolTaskScheduler syncScheduler new ThreadPoolTaskScheduler();syncScheduler.setPoolSize(10);syncScheduler.setThreadGroupName("s…

智慧公厕助推城市管理智能化和治理精细化

随着城市化进程的不断加快&#xff0c;城市管理面临着诸多挑战和问题。而智慧公厕作为城市数字化赋能的重要一环&#xff0c;正成为推动城市管理智能化和治理精细化的关键力量。本文将以智慧公厕头部厂家广州中期科技有限公司&#xff0c;所实施大量精品案例项目的实景实图&…

【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)

目录 一、前言 二、实验环境 三、Python基本数据类型 3. 字符串&#xff08;Strings&#xff09; 1. 初始化 2. 索引 3. 切片 4. 运算 a. 拼接运算 b. 复制运算 c. 子串判断 d. 取长度 5. 格式化 a. 使用位置参数 b. 使用关键字参数 c. 使用属性访问 f-string…

【linux命令讲解大全】076.pgrep命令:查找和列出符合条件的进程ID

文章目录 pgrep补充说明语法选项参数实例 从零学 python pgrep 根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID&#xff08;PID&#xff09; 补充说明 pgrep 命令以名称为依据从运行进程队列中查找进程&#xff0c;并显示查找到的进程ID。每一个进程ID以一个…

计算机毕设之基于Hadoop+springboot的物品租赁系统的设计与实现(前后端分离,内含源码+文档+教程)

该系统基于Hadoop平台&#xff0c;利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将物品租赁管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。在确保系统稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该系统由管理员功能…

Mybatis 框架 ( 四 ) QueryWrapper

4.5.Wrapper条件构造器 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 UpdateWrapper &am…