实例 | Python 实现 RSA 加解密

news2024/12/29 11:31:25

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

前阵子看到一篇英文文章[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.coloradmin.cn/o/1003107.html

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

相关文章

平板用的触控笔什么牌子好?开学便宜电容笔推荐

在新学期即将来临之际&#xff0c;你觉得什么样的电容笔才是最好的选择呢&#xff1f;我是一个数码爱好者&#xff0c;有几年以上的使用经验&#xff0c;也知道一些关于电容笔的事情。我觉得&#xff0c;这款苹果原装的电容笔&#xff0c;与普通的电容笔最大的不同之处&#xf…

手把手教你,如何先梳理业务逻辑再写代码

1.业务逻辑与代码 代码是需求逻辑的一种展现形式 需求文档是业务逻辑的一种展现形式&#xff0c;而代码不过是业务逻辑的另一种表现形式&#xff1b;如果逻辑本身有问题&#xff0c;那么它的各种展示形式自然也是错的&#xff0c;所以写代码前应该先思考清楚业务逻辑。 Revi…

【校招VIP】专业课考点之网络存储

考点介绍&#xff1a; cookie、session和localstorage 是目前常用的存储机制&#xff0c;不管是大厂还是中小公司&#xff0c;都会对这个问题有比较高的考察频度&#xff0c;而且有一定的深度和对比分析 专业课考点之网络存储-相关题目及解析内容可点击文章末尾链接查看&#…

为什么C ++在嵌入式系统设计中是C的可行替代品

你是一名。你知道C是适合该工作的语言&#xff0c;尽管有时维护周期可以重复很长时间。有时你会感到that琐&#xff0c;就像在编码自动机一样&#xff0c;反复在结构上创建基本迭代&#xff0c;这些结构与上周或上个月的结构非常相似。 你已经听说过C 作为一种功能强大的语言的…

【AI绘画接口】Midjourney是什么?Midjourney有官方接口吗?

什么是 Midjourney&#xff1f; 随着AI技术的发展&#xff0c;AI聊天、AI绘画都从小众尝鲜逐渐应用到了生产当中。现在市面上的绘画AI并不少&#xff0c;而 Midjourney 是其中最好用的之一。我们只需要输入一些提示词&#xff0c;Midjourney 就能根据输入的提示词自动生成符合…

怎么找回回收站删除的文件?轻松恢复数据,就看这3个方法!

“求助求助&#xff01;回收站删除的文件还有找回来的机会吗&#xff1f;一不小心就把回收站中的文件删除了&#xff0c;现在不知道该如何是好了&#xff0c;希望热心的网友们可以帮帮我&#xff01;” 大家都知道&#xff0c;电脑有一个功能叫回收站&#xff0c;系统会将我们删…

代码随想录 -- day49 -- 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 动态规划&#xff1a; dp[i][0] 表示第i天持有股票所得最多现金&#xff0c;dp[i][0] 表示第i天持有股票所得最多现金。 第i-1天就持有股票&#xff0c;那么就保持现状&#xff0c;所得现金就是昨天持有股票的所得现金 即&#xff1a;dp[i - 1][0]第…

echarts折线图每段显示不同的颜色

效果图 配置项&#xff1a; zqChartFour: {title: {text: "一天用电量分布",subtext: "纯属虚构",},tooltip: {trigger: "axis",axisPointer: {type: "cross",},},toolbox: {show: true,feature: {saveAsImage: {},},},xAxis: {type:…

Linux 中nc指令的使用总结

nc指令概述用法一&#xff1a;端口扫描用法二&#xff1a;命令行中发送和接收数据用法三&#xff1a;建立双方通信 nc指令概述 nc 是 Linux 系统中的 netcat 命令之简称&#xff0c;它是一个强大的网络工具&#xff0c;可以用于创建 TCP/UDP 套接字连接。常见的其用法模板可定…

目标检测中生成锚框函数详解

将设一张图片&#xff0c;宽和高为2,2 X torch.rand(size(1,3,2,2)) Y generate_anchors(X,sizes[0.75,0.5,0.25],ratios[1,2,0.5])锚框中心点的设置 # 为每个像素可以生成 nm-1个锚框&#xff0c;整个图像生成 wh(nm-1) def generate_anchors(data,sizes,ratios): # 书上的…

重磅预告 |第十二届中国智能产业高峰论坛9月16日在昌开幕,集团董事长李火亮任专题联席主席,出席本次活动

在这个数字化、智能化社会经济高速迭代的时代&#xff0c;每一次技术的进步都预示着一个全新的未来。在此背景下第十二届中国智能产业高峰论坛即将拉开帷幕。9月16日-9月18日高峰论坛在中国南昌举行&#xff0c;拓世科技集团董事长李火亮将亲身出席本次活动&#xff0c;与众多领…

解决:AD装配输出拾放文件出现闪退问题

PCB在装配输出过程中&#xff0c;需要导出拾放文件&#xff0c;但是今天每次执行这个过程&#xff0c;AD软件就会直接闪退。 重启AD把项目管理器中没有关掉的一系列乱七八糟文件手动关闭关闭AD软件再次重启AD&#xff0c;打开项目重新导出。

YOLOv5 加入SE注意力机制

步骤1&#xff1a;在common.py中添加SE模块 class SE(nn.Module): def __init__(self, c1, c2, r16): super(SE, self).__init__() self.avgpool nn.AdaptiveAvgPool2d(1) self.l1 nn.Linear(c1, c1 // r, biasFalse) self.relu nn.ReL…

付费咨询擅长领域

曾获中国电机工程学报优秀审稿专家&#xff0c;控制与决策审稿专家&#xff0c;系统工程与电子技术审稿专家&#xff0c;计算机科学审稿专家&#xff0c;Mechanical System and Signal Processing审稿专家。 擅长现代信号处理&#xff08;小波分析类&#xff0c;模态分解类&…

SAP 自定义权限对象开发与使用

如何自定义一个权限对象&#xff0c;然后分配到对应的权限角色中&#xff0c;进行用户权限的控制&#xff1f; 具体实现步骤如下&#xff1a; 1. 创建数据元素 进入事务码&#xff1a; SE11 2. 创建权限字段 进入事务码SU20 3. 创建权限对象类以及权限对象 事务码&#xf…

redis集群的维护(redis-cli --cluster 命令用法)

目录 前言 1、 --cluster create 创建集群 2、--cluster check 检查集群 3、--cluster info 查看集群 4、--cluster fix 修复集群 5、--cluster rehard 迁移槽位 6、 --cluster rebalance 平衡集群 7、 --cluster add-node 集群扩容 8、--cluster del-node …

实现读写分离(MySQL主从数据库)

读写别离&#xff08;Read/Write Splitting&#xff09;。 1.原理&#xff1a; 让主数据库&#xff08;master&#xff09;处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库&#xff08;slave&#xff09;处理SELECT查询操作。 …

论文复制ChatGPT按钮被发表,撤回后再曝多个类似案例;Midjourney 生成大师级的人像

&#x1f989; AI新闻 &#x1f680; 论文复制ChatGPT按钮被发表&#xff0c;撤回后再曝多个类似案例 摘要&#xff1a;一篇物理论文复制了ChatGPT按钮内容&#xff0c;经过两个月同行评审并在杂志上发表。这一现象被知名打假人发现后&#xff0c;发表商决定撤回该论文。此外…

doccano 文本标注工具使用

最近在做面向大模型的文本标注工作&#xff0c;涉及到多人协同的问题&#xff0c;因此用到了doccano工具。 这个工具可以使用docker进行安装&#xff0c;安装之后的启动也都比较简单。 关于基础使用&#xff08;例如管理员登录、新建任务、上传数据集等&#xff09;&#xff…

推荐 4 个本周 火火火火 的开源项目

本期推荐开源项目目录&#xff1a; 1. 一个集成了主流 AI 大模型的 APP 2. 模拟人类行为的小镇 3. 离线 OCR 软件 4. 流程图编辑框架 01 一个集成了主流 AI 大模型的 APP 该开源项目集成了主流的大语言模型、绘图模型&#xff0c;基于Flutter开发&#xff0c;支持问答聊天、文生…