2022年5月21日 17:38 by wst
python高级本文主要演示数字信封的使用方式,包含逻辑和代码。
甲要传递数据(明文)给乙,流程如下所示:
如果想了解细节,参考数字信封简介。
具体代码如下,已添加注释:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import Crypto.Signature.PKCS1_v1_5
import Crypto.Hash.SHA256
# 通过ssh-keygen命令可产生下面两个文件
F_KEY = "/home/wst/.ssh/id_rsa.pub"
F_SECRET = "/home/wst/.ssh/id_rsa"
s_key = RSA.importKey(open(F_KEY, "rb").read())
s_secret = RSA.importKey(open(F_SECRET, "rb").read())
# -----------1.公钥加密---------------------------
# 数据
data_content = "Hello World".encode()
# 加密
pub_cipher = PKCS1_v1_5.new(s_key)
ciphertext = pub_cipher.encrypt(data_content)
# ----------2.私钥签名------
# 创建私钥签名工具
pri_signer = Crypto.Signature.PKCS1_v1_5.new(s_secret)
# 创建hash对象
msg_hash = Crypto.Hash.SHA256.new()
# 对数据内容进行hash
msg_hash.update(data_content)
# 使用私钥工具对数据进行签名
signature_result = pri_signer.sign(msg_hash)
# ------------3.发送的数据-------------------
send_data = {
"data": ciphertext,
"sign": signature_result
}
# -----------4.接收数据后解密------------
pri_cipher = PKCS1_v1_5.new(s_secret)
plaintext = pri_cipher.decrypt(ciphertext, sentinel=None)
print("解密后的数据:", plaintext.decode())
# -----------5.接收数据后验证签名---------
# 创建公钥验签工具
pub_signer = Crypto.Signature.PKCS1_v1_5.new(s_key)
# 创建hash对象
msg_hash = Crypto.Hash.SHA256.new()
# 对内容进行hash
msg_hash.update(plaintext)
# 使用公钥 验签工具 对 数据和签名 进行验签, 返回 True/False
verify = pub_signer.verify(msg_hash, signature_result)
if verify:
print("数据有效")
else:
print("数据无效")
说明:
1. 所用python版本为3.8.13,依赖包为pycryptodome==3.14.1
2. 代码的逻辑和第一部分的逻辑不完全一样,下面描述的为代码的逻辑:
大家发现了吗?这里有个前提:甲方和乙方已经交换过公钥。
另外在实际当中,由于非对称加密较慢,一般采用的是对称加密算法,然后把秘钥用非对称加密算法加密。
如果你看懂了,还会发现,代码对流程图的做了简化,只用了一对公钥/私钥。