当前位置:网站首页>使用这个,你发的消息就无法被监控了
使用这个,你发的消息就无法被监控了
2022-07-28 21:44:00 【somenzz】
我觉得每一个人都应该学会使用 RSA,因为只有在加密的世界里,我们的隐私才能真正被保护。今天就来分享一下如何用 Python 来应用 RSA。
先说个场景,你是 A,要发一个重要的消息给 B,但是通过任何聊天 APP 都是不安全的,可能被监控,也可能被记录,因此你需要对消息加密。
怎么加密安全,那就是用 RSA 的公钥加密,私钥解密,公钥可以公开,私钥不公开。
第一步:密钥生成并交换公钥
先 pip install rsa
A 生成一对 RSA 密钥,叫公钥 A,私钥 A
from rsa import newkeys
public_key_a, private_key_a = newkeys(2048, poolsize=8)
with open("public_key_a.pem", "wb") as f:
f.write(public_key_a.save_pkcs1(format="PEM"))
with open("private_key_a.pem", "wb") as f:
f.write(private_key_a.save_pkcs1(format="PEM"))public_key_a.pem 的内容如下:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEArAdHKqjnVzeMt+4DpmQvoQsaKokL05+DS6Kykj1KiOmVWLreIUfP
fvedIRykBFNODwHQHGtWGPeaMYs86+9zdIRMtqC0TlXQyj74aP9CTAV43SSA65kY
EwQVJh3QBmrQok8lEljhN/QbiWrw4xG+rYP6BgsHFM3tuHb6oIkuhL6r+A3hj2ep
DY3jxn0ZPNSN10i9tTC/KXqKGnJrOAEQ6nNL/mAnFLwiuDQrEBmXfnK5bpw7hjDy
pJ0Cs3JM74+OTxo76Tbay1nWGGipLSXzRCXQW2+AD4Q6bFq6nuGic9gQLvQa11B7
XZVhVvVTxrezAOMYL3FOFXfIFqOB8HvTEQIDAQAB
-----END RSA PUBLIC KEY-----B 生成一对 RSA 密钥,叫公钥 B,私钥 B。
from rsa import newkeys
public_key_b, private_key_b = newkeys(2048, poolsize=8)
with open("public_key_b.pem", "wb") as f:
f.write(public_key_b.save_pkcs1(format="PEM"))
with open("private_key_b.pem", "wb") as f:
f.write(private_key_b.save_pkcs1(format="PEM"))A 把文件 public_key_a.pem 发送给 B,B 也把 public_key_b.pem 发送给 A,这样就完成了密钥的交换。后面 A 要和 B 通信,就用 B 的公钥加密消息,B 用自己的私钥解密,就可以得到 A 发送的消息,反之亦然。
第二步: 加密
比如说 A 现在有了 B 的公钥,要对消息进行加密的时候,先载入 B 的公钥:
import base64
from rsa import PublicKey, PrivateKey, encrypt, decrypt,
public_key_b_file = Path("./public_key_b.pem")
public_key_b = PublicKey.load_pkcs1(public_key_b_file.read_bytes(), format="PEM")
print(public_key_b)可以得到这样的输出
PublicKey(21831899084185660921840174683452830587321319689015722246782364711292417600371532112177905506057539367671580668438126704427894857192387484162751992715040787885971624030995019473104987454304337735143558728644817397903950824366991556950207676816787133824709081376405184001095218083813620277536858163575686850410455092011765877504499366336792653732470469604531683754075419135479867324338689671063858801578735120084016574895760616498188773853425143006311923355945139917528996017456427975883103933944819388497917519791324247040364723098266886847457872058619189743684510784904551008906591879274280765194272666652349889346853, 65537)然后把明文先按照 utf-8 编码成字节,在加密,然后转 base64,就可以发送给 B 了。
import base64
from rsa import PublicKey, PrivateKey, encrypt, decrypt
if __name__ == "__main__":
public_key_b_file = Path("./public_key_b.pem")
public_key_b = PublicKey.load_pkcs1(public_key_b_file.read_bytes(), format="PEM")
# print(public_key_b)
orgin_message = "取款的密码是 123321"
encrypt_message = base64.b64encode(
encrypt(orgin_message.encode("utf-8"), public_key_b)
)
print(encrypt_message.decode())密文就是:
mlVecdANZxsvXPivECRvNpoJr+2NxElM84moDr5N3FoKdxvubcHcteA4AW7UyHMj2PD96jaiQiD6hWX6M4dFePi05IE6k6JdAVXWSq5fTbZsiqBggidrcDL3azAaW5e4jQ6md6Bem1XcVAo2u1meIl+rXPKLUECu9R4tkgjtUTgUZpZ7rObl18Sz51A86ZxxRIEwkmG+TYJUPa27CyMPgD0zqlrKqh4SjIRZ1e3SmWxyet+3XFLE2b1XJwMhPUOFsJEO6qs204WtvpOYH0nGQorYsJe+ReIx/W0zZyK4zE+En9xW7fBByYNrseonh3sm6ALG6cRpZV/Odd2vmRUtOQ==而且同一个明文每次加密成密文的结果都不一样,暴力破解也几乎不可能:

第二步: 解密
解密就是用自己的密钥解密,也要先载入自己的私钥,与 public_key_b 是一对。
import base64
from rsa import PublicKey, PrivateKey, encrypt, decrypt
if __name__ == "__main__":
encrypted_msg = "mlVecdANZxsvXPivECRvNpoJr+2NxElM84moDr5N3FoKdxvubcHcteA4AW7UyHMj2PD96jaiQiD6hWX6M4dFePi05IE6k6JdAVXWSq5fTbZsiqBggidrcDL3azAaW5e4jQ6md6Bem1XcVAo2u1meIl+rXPKLUECu9R4tkgjtUTgUZpZ7rObl18Sz51A86ZxxRIEwkmG+TYJUPa27CyMPgD0zqlrKqh4SjIRZ1e3SmWxyet+3XFLE2b1XJwMhPUOFsJEO6qs204WtvpOYH0nGQorYsJe+ReIx/W0zZyK4zE+En9xW7fBByYNrseonh3sm6ALG6cRpZV/Odd2vmRUtOQ=="
private_key_b_file = Path("./private_key_b.pem")
private_key_b = PrivateKey.load_pkcs1(private_key_b_file.read_bytes(), format="PEM")
origin_message = decrypt(base64.b64decode(encrypted_msg.encode()), private_key_b)
print(origin_message.decode("utf-8"))
# 取款的密码是 123321只要 B 的私钥没有泄漏,那就只有 B 才能解开这段密文,所以非常安全。
最后的话
本文分享了在 Python 中如何使用 RSA 加解密,你可以基于此做一个与加密通信程序,希望对你有所帮助。
推荐:
边栏推荐
- Xshell7, xftp7 personal free version official download, no need to crack, no activation, download and use
- 当初的“你“为什么做测试/开发程序员?自己存在的价值......
- Form label
- Recurrent neural network (RNN)
- Typescript防止基类被实例化
- Applet Download Preview PDF, document cannot open solution
- Runloop, auto release pool, thread, GCD
- [radar] radar signal online sorting based on kernel clustering with matlab code
- 终端输出g_debug()信息
- 如何在VR全景中嵌入AI数字人功能?打造云端体验感
猜你喜欢

WebView optimization

行泊ADAS摄像头前装搭载同比增长54.15%,TOP10供应商领跑

18 diagrams, intuitive understanding of neural networks, manifolds and topologies

Performance optimized APK slimming

Istio微服务治理网格的全方面可视化监控(微服务架构展示、资源监控、流量监控、链路监控)

Objc4-841.13 debuggable / compiled source code update

Sdwebimage source code combs 5 author motivation, modifies directory, and changes inheritance relationship

The functions and differences of display, visibility and overflow

Runloop principle (I)

「行泊一体」放量,福瑞泰克高性能域控制器领跑新赛道
随机推荐
Arduino UNO驱动合宙1.8‘TFT SPI屏幕示例演示(含资料包)
智能电视与小程序的结合
参加竞赛同学们的留言 : 第十七届的记忆
Elements in the middle (one article is enough)
18 diagrams, intuitive understanding of neural networks, manifolds and topologies
The front mounted ADAS camera in parking increased by 54.15% year-on-year, with TOP10 suppliers taking the lead
Advanced C language: pointer (2)
如何在VR全景中嵌入AI数字人功能?打造云端体验感
行泊ADAS摄像头前装搭载同比增长54.15%,TOP10供应商领跑
Typescript类方法this指针绑定
Sdwebimage source code combs 5 author motivation, modifies directory, and changes inheritance relationship
欲要让数字零售继续发挥作用,我们需要对数字零售赋予新的内涵和意义
Use of typescript class
Rouyi cloud platform - how to realize the launch and login functions of the project and how to create new modules
MySQL数据库的基本概念以及MySQL8.0版本的部署(一)
字节8年女测试总监工作感悟—写给想转行或即将进入测试行业的女生们...
trivy【2】工具漏洞扫描
华为无线设备配置利用WDS技术部署WLAN业务
PCA learning
Runloop, auto release pool, thread, GCD