我觉得每一个人都应该学会使用 RSA,因为只有在加密的世界里,我们的隐私才能真正被保护。今天就来分享一下如何用 Python 来应用 RSA。
先说个场景,你是 A,要发一个重要的消息给 B,但是通过任何聊天 APP 都是不安全的,可能被监控,也可能被记录,因此你需要对消息加密。
怎么加密安全,那就是用 RSA 的公钥加密,私钥解密,公钥可以公开,私钥不公开。
第一步:密钥生成并交换公钥
先 pip install rsa
A 生成一对 RSA 密钥,叫公钥 A,私钥 A
代码语言:javascript复制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 的内容如下:
代码语言:javascript复制-----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。
代码语言:javascript复制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 的公钥:
代码语言:javascript复制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)
可以得到这样的输出
代码语言:javascript复制PublicKey(21831899084185660921840174683452830587321319689015722246782364711292417600371532112177905506057539367671580668438126704427894857192387484162751992715040787885971624030995019473104987454304337735143558728644817397903950824366991556950207676816787133824709081376405184001095218083813620277536858163575686850410455092011765877504499366336792653732470469604531683754075419135479867324338689671063858801578735120084016574895760616498188773853425143006311923355945139917528996017456427975883103933944819388497917519791324247040364723098266886847457872058619189743684510784904551008906591879274280765194272666652349889346853, 65537)
然后把明文先按照 utf-8 编码成字节,在加密,然后转 base64,就可以发送给 B 了。
代码语言:javascript复制
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())
密文就是:
代码语言:javascript复制mlVecdANZxsvXPivECRvNpoJr 2NxElM84moDr5N3FoKdxvubcHcteA4AW7UyHMj2PD96jaiQiD6hWX6M4dFePi05IE6k6JdAVXWSq5fTbZsiqBggidrcDL3azAaW5e4jQ6md6Bem1XcVAo2u1meIl rXPKLUECu9R4tkgjtUTgUZpZ7rObl18Sz51A86ZxxRIEwkmG TYJUPa27CyMPgD0zqlrKqh4SjIRZ1e3SmWxyet 3XFLE2b1XJwMhPUOFsJEO6qs204WtvpOYH0nGQorYsJe ReIx/W0zZyK4zE En9xW7fBByYNrseonh3sm6ALG6cRpZV/Odd2vmRUtOQ==
而且同一个明文每次加密成密文的结果都不一样,暴力破解也几乎不可能:
第二步: 解密
解密就是用自己的密钥解密,也要先载入自己的私钥,与 public_key_b 是一对。
代码语言:javascript复制
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 加解密,你可以基于此做一个与加密通信程序,希望对你有所帮助。