python实现非对称加密算法_Python3非对称加密算法RSA实例详解

本文实例讲述了Python3非对称加密算法RSA。分享给大家供大家参考,具体如下:

python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥、私钥。

其中 python3.6 Crypto 库的安装方式请参考前面一篇《Python3对称加密算法AES、DES3》

rsa 加解密的库使用 pip3 install rsa 就行了

C:\WINDOWS\system32>pip3 install rsa

Collecting rsa

Downloading https://files.pythonhosted.org/packages/e1/ae/baedc9cb175552e95f3395c43055a6a5e125ae4d48a1d7a924baca83e92e/rsa-3.4.2-py2.py3-none-any.whl (46kB)

100% |████████████████████████████████| 51kB 99kB/s

Collecting pyasn1>=0.1.3 (from rsa)

Downloading https://files.pythonhosted.org/packages/a0/70/2c27740f08e477499ce19eefe05dbcae6f19fdc49e9e82ce4768be0643b9/pyasn1-0.4.3-py2.py3-none-any.whl (72kB)

100% |████████████████████████████████| 81kB 289kB/s

Installing collected packages: pyasn1, rsa

Successfully installed pyasn1-0.4.3 rsa-3.4.2

使用 Crypto.PublicKey.RSA 生成公钥、私钥:

import Crypto.PublicKey.RSA

import Crypto.Random

x = Crypto.PublicKey.RSA.generate(2048)

a = x.exportKey("PEM") # 生成私钥

b = x.publickey().exportKey() # 生成公钥

with open("a.pem", "wb") as x:

x.write(a)

with open("b.pem", "wb") as x:

x.write(b)

y = Crypto.PublicKey.RSA.generate(2048, Crypto.Random.new().read) # 使用 Crypto.Random.new().read 伪随机数生成器

c = y.exportKey() # 生成私钥

d = y.publickey().exportKey() #生成公钥

with open("c.pem", "wb") as x:

x.write(c)

with open("d.pem", "wb") as x:

x.write(d)

使用 Crypto.PublicKey.RSA.importKey(private_key) 生成公钥和证书:

import Crypto.PublicKey.RSA

with open("a.pem", "rb") as x:

xx = Crypto.PublicKey.RSA.importKey(x.read())

b = xx.publickey().exportKey() # 生成公钥

with open("b.pem", "wb") as x:

x.write(b)

a = xx.exportKey("DER") # 生成 DER 格式的证书

with open("a.der", "wb") as x:

x.write(a)

使用 rsa 生成公钥、私钥:

import rsa

f, e = rsa.newkeys(2048) # 生成公钥、私钥

e = e.save_pkcs1() # 保存为 .pem 格式

with open("e.pem", "wb") as x: # 保存私钥

x.write(e)

f = f.save_pkcs1() # 保存为 .pem 格式

with open("f.pem", "wb") as x: # 保存公钥

x.write(f)

RSA非对称加密算法实现:

使用Crypto模块:

import Crypto.PublicKey.RSA

import Crypto.Cipher.PKCS1_v1_5

import Crypto.Random

import Crypto.Signature.PKCS1_v1_5

import Crypto.Hash

y = b"abcdefg1234567"

with open("b.pem", "rb") as x:

b = x.read()

cipher_public = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(b))

cipher_text = cipher_public.encrypt(y) # 使用公钥进行加密

with open("a.pem", "rb") as x:

a = x.read()

cipher_private = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(a))

text = cipher_private.decrypt(cipher_text, Crypto.Random.new().read) # 使用私钥进行解密

assert text == y # 断言验证

with open("c.pem", "rb") as x:

c = x.read()

c_rsa = Crypto.PublicKey.RSA.importKey(c)

signer = Crypto.Signature.PKCS1_v1_5.new(c_rsa)

msg_hash = Crypto.Hash.SHA256.new()

msg_hash.update(y)

sign = signer.sign(msg_hash) # 使用私钥进行'sha256'签名

with open("d.pem", "rb") as x:

d = x.read()

d_rsa = Crypto.PublicKey.RSA.importKey(d)

verifer = Crypto.Signature.PKCS1_v1_5.new(d_rsa)

msg_hash = Crypto.Hash.SHA256.new()

msg_hash.update(y)

verify = verifer.verify(msg_hash, sign) # 使用公钥验证签名

print(verify)

运行结果:

True

使用 rsa 模块:

import rsa

y = b"abcdefg1234567"

with open("e.pem", "rb") as x:

e = x.read()

e = rsa.PrivateKey.load_pkcs1(e) # load 私钥

with open("f.pem", "rb") as x:

f = x.read()

f = rsa.PublicKey.load_pkcs1(f) # load 公钥,由于之前生成的私钥缺少'RSA'字段,故无法 load

cipher_text = rsa.encrypt(y, f) # 使用公钥加密

text = rsa.decrypt(cipher_text, e) # 使用私钥解密

assert text == y # 断言验证

sign = rsa.sign(y, e, "SHA-256") # 使用私钥进行'sha256'签名

verify = rsa.verify(y, sign, f) # 使用公钥验证签名

print(verify)

运行结果:

True

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线RSA加密/解密工具:http://tools.jb51.net/password/rsa_encode

文字在线加密解密工具(包含AES、DES、RC4等):http://tools.jb51.net/password/txt_encode

MD5在线加密工具:http://tools.jb51.net/password/CreateMD5Password

在线散列/哈希算法加密工具:http://tools.jb51.net/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:http://tools.jb51.net/password/hash_md5_sha

在线sha1/sha224/sha256/sha384/sha512加密工具:http://tools.jb51.net/password/sha_encode

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

本文标题: Python3非对称加密算法RSA实例详解

本文地址: http://www.cppcns.com/jiaoben/python/246549.html

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

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

相关文章

python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营

第三次参加百度的7天训练营了这次参加的主题是【Python小白逆袭大神】,不过你别看是小白逆势。。。除非你一开始参加就逆袭完,不然你真的是python小白,这个课程还是有难难度的。说一下个训练营的特点版。这个营从python一些基础练习-->数据…

潍坊学院的计算机类怎么样,潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!...

潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!潍坊学院教育技术学专业怎么样?有知道的…

elasticsearch配置文件详解

elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就…

Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)

文章目录1. 类和对象2. Trait3. 模式匹配4. 正则5. 异常处理6. 提取器7. 文件 IO学自 https://www.runoob.com/scala/scala-tutorial.html 1. 类和对象 object myClass {import java.io._class Point(xc : Int, yc : Int){var x : Int xcvar y : Int ycdef move(dx:Int, dy…

The Power of Android Action Bars(转载)

转自:http://www.informit.com/articles/article.aspx?p1743642转载于:https://www.cnblogs.com/lance-ehf/p/4285239.html

计算机网络校园网简单设计与实现,简单校园网的设计与实现.docx

本科课程考查(论文)专用封面作业(论文)题目:所修课程名称:简单校园网的设计与实现 《计算机网络实践》修课程时间: 2012年 9月至 2012年 12月完成作业(论文)日期:2012年12月评阅成绩:评阅意见:评阅教师签名…

python面向对象继承

如果一个A类继承自另一个B类,就把这个A类称为B的子类,把B称为A的父类或者超类。继承可以使子类具有父类的各种属性和方法,而不再需要写相同的代码。在令子类继承父类的同时,可以重新定义某些属性和方法,使其获得与父类…

c++ class struct同名_C/C++面向对象编程之封装

点击“蓝字”关注我们吧前言:何为面向过程:面向过程,本质是“顺序,循环,分支” 面向过程开发,就像是总有人问你要后续的计划一样,下一步做什么,再下一步做什么,意外、事物…

LeetCode 1718. 构建字典序最大的可行序列(贪心+回溯)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n ,请你找到满足下面条件的一个序列: 整数 1 在序列中只出现一次。2 到 n 之间每个整数都恰好出现两次。对于每个 2 到 n 之间的整数 i ,两个 i 之间出现的距离恰好为 i 。 序列里面两个数 a[…

collections求和方法_java集合求和最大值最小值示例分享

package com.happyelements.athene.game.util;import static com.google.common.base.Preconditions.checkNotNull;import java.util.Collection;import com.google.common.collect.Lists;/*** Math工具类** version 1.0* since 1.0*/public class MathUtil {/*** see MathUtil…

为什么要给计算机配置IP地址,更改ip地址 为何要重启电脑

在系统中,如果想修改计算机的IP地址,系统会提示重新启动计算机,有没有什么办法不重启机器又照样改IP呢? 首先按自己的需要改动IP地址,点击[确定] 按钮后,系统会出现重新启动计算机的提示。此时点击[否]&…

static函数

// 以下摘自网络 静态函数在函数的返回类型前加上关键字static&#xff0c;函数就被定义成为静态函数。函数的定义和声明默认情况下是extern的&#xff0c;但静态函数只是在声明他的文件当中可见&#xff0c;不能被其他文件所用。定义静态函数的好处&#xff1a;<1> 其他…

python中数据类型转换原理_python的可变与不可变数据类型的原理是什么呢?

Python中变量的进阶知识&#xff1a; 涉及到Python的对象知识。 即&#xff1a;可变对象和不可变对象。题目中的可变和不可变数据类型&#xff0c;表述不准确。 Python中&#xff0c;一切皆对象。 对象是一种抽象。抽象是什么&#xff1f;抽象就是一种概念上的简化。 《learnin…

python股票历史最低点_Python统计某一只股票每天的开盘,收盘,最高,最低价格!...

模块&#xff1a;Numpy码字不易&#xff0c;转载请注明出处&#xff01;十分感谢&#xff01;准备工作&#xff1a;抓取某一只股票的信息&#xff0c;每30min为一组数据&#xff0c;可以参考上一篇&#xff1a;Note: 只为演示如何统计&#xff0c;更精准的可以抓取每5min为一组…

操作系统是计算机的什么管理者,操作系统是计算机资源的管理者

由计算机提供的、因应用程序的存在和运行所消耗或占用的物质条件&#xff0c;叫做计算机的资 源&#xff0c;例如处理器的时间、内存空间、外部设各等。为了有效地利用计算机的各种资源&#xff0c;操作系统 必须为用户承担起对计算机资源的管理任务。例如&#xff0c;为了使应…

python文件流读取二进制_Python使用web.py从POST请求中提取二进制文件

I am developing an API that allows outside clients to send a binary file which will be processed. my web.data() is a string and the function I am calling requires a binary. How do I get it into the correct format? Maybe I have the incorrect Headers? how …

LeetCode 1828. 统计一个圆中点的数目

文章目录1. 题目2. 解题1. 题目 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries &#xff0c;其中 queries[j] [xj, yj, rj] &#xff0c;表示一个圆心在…

elasticsearch threadpool

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-threadpool.html转载于:https://www.cnblogs.com/SamuelSun/p/4287218.html

python argument list too long_[已解决]Argument list too long如何处理?

Argument list too long 本质是需要处理的长度超过系统的长度&#xff0c;因此无法执行相关命令。经过搜索发现了两种方法&#xff0c;思想都是将参数切分成小的段落进行执行。法一&#xff1a;通过xargs传递参数 (数据量大了还是不太奏效)find . -name "*.log" | xa…

计算机专业内存容量8g,内存容量8g和16g区别

语音内容&#xff1a;大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以计算机为例&#xff0c;内存容量8g和16g区别如下&#xff1a;1、16GB和8GB内存在同品牌、同芯片规格等情况下&#xff0c;仅存在容量大小区别&#xff0c;即1…