我觉得每一个人都应该学会使用 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 加解密,你可以基于此做一个与加密通信程序,希望对你有所帮助,想要了解更多欢迎持续关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9814/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料