数字签名&数字信封

本文介绍了数字签名的生成及验证方法,并详细阐述了数字信封的创建与解密过程,为信息安全领域的读者提供了实用的技术指导。

1, 生成数字签名


2, 验证数字签名


3, 生成数字信封


4, 解密数字信封


### 结合使用数字信封数字签名 为了确保消息的真实性和保密性,在实际应用中可以将数字信封数字签名相结合。这种方式不仅能够保证信息传输过程中的安全性,还能验证发送者的身份以及确保信息未被篡改。 #### 实现流程 1. **创建信息摘要并生成数字签名** 发送方先利用哈希函数计算原始文件的消息摘要,再通过自身的私钥对该摘要进行加密处理形成数字签名[^4]。 2. **构建数字信封** 接下来,发送方会随机生成一个对称密钥用于加密原文件内容。此操作采用高效的对称加密算法完成。之后,这个临时使用的对称密钥会被接收方的公钥加密,从而构成所谓的“数字信封”。整个过程中涉及到两个层次的不同类型的加密方式:一是针对主体文档本身的高强度快速加解密机制;二是专门用来保护传递给定秘钥材料的安全通道建立方法[^1]。 3. **打包发送** 将上述两部分——即经过对称加密后的文件加上由非对称加密所得的数字信封连同之前准备好的数字签名一同封装成最终的数据包传送给对方。 4. **接收端解析** 当接收到完整的数据包后,接收者首先运用自己的私钥打开数字信封取出内部隐藏着的一次性对称密钥。接着凭借该密钥解开包裹在外层的大容量资料实体。此同时,还需重复执行一次同样的散列运算来重新获取一份新鲜出炉的信息指纹,并将其拿来跟随附而来的那个已经过公开认证过的版本做对比校验工作。最后一步则是调用发件人的官方公布版公钥资源库里的对应项去检验所携带过来的手写体样式数位签署样本的真实性[^2]。 ```python import hashlib from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP, AES from Crypto.Random import get_random_bytes from Crypto.Signature import pkcs1_15 from Crypto.Hash import SHA256 def create_digital_envelope_and_signature(message, sender_private_key, receiver_public_key): # 创建信息摘要并生成数字签名 message_hash = SHA256.new(message.encode()) signature = pkcs1_15.new(sender_private_key).sign(message_hash) # 构建数字信封 session_key = get_random_bytes(16) cipher_rsa = PKCS1_OAEP.new(receiver_public_key) encrypted_session_key = cipher_rsa.encrypt(session_key) cipher_aes = AES.new(session_key, AES.MODE_EAX) ciphertext, tag = cipher_aes.encrypt_and_digest(message.encode()) return { 'encrypted_message': (ciphertext, tag, cipher_aes.nonce), 'digital_envelope': encrypted_session_key, 'signature': signature } def verify_and_decrypt(enveloped_data, sender_public_key, receiver_private_key): try: # 解析数字信封取回一次性对称密钥 decipher_rsa = PKCS1_OAEP.new(receiver_private_key) session_key = decipher_rsa.decrypt(enveloped_data['digital_envelope']) # 使用恢复出来的对称密钥解码正文 cipher_aes = AES.new(session_key, AES.MODE_EAX, enveloped_data['encrypted_message'][2]) decrypted_message = cipher_aes.decrypt_and_verify( enveloped_data['encrypted_message'][0], enveloped_data['encrypted_message'][1] ) # 验证数字签名 message_hash = SHA256.new(decrypted_message) pkcs1_15.new(sender_public_key).verify(message_hash, enveloped_data['signature']) return True, decrypted_message.decode() except Exception as e: return False, str(e) # 示例代码省略了具体密钥对象的初始化逻辑,请根据实际情况补充完整。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值