数字签名和数字信封的区别

本文介绍了数字签名和数字信封的基本概念和技术实现过程。数字签名通过散列函数和私钥加密来验证消息的真实性和完整性;数字信封采用对称加密和公钥加密相结合的方式,确保数据传输的安全。

一、数字签名

数字签名使用双钥密码加密和散列函数. 消息用散列函数处理得到消息搞要,再用双钥密码体制的私钥对其进行加密,称为数字签名.

数字签名的原理如下:消息M用散列函数H得到的消息摘要h1=H(M),然后发送方用自己的双钥密码体制的私钥KSA对这个消息摘要进行加密h’=EKSA(h1),形成发送方的数字签名.然后这个数字签名将作为消息M的附件随消息一起发送给消息的接收方,消息的接收方首先从接收方的原始消息M中计算出散列函数值h2=H(M),接着用发送双钥密码体制的公钥KPA对数字签名进行解密DKPA(h’),得h1,如果h1=h2,则表明接收方收到的消息确实是发送方发送的,而且还可以确定此消息没有被修改过.

用表达式表示如下:

发送方: h1=H(M)

          h’=EKSA(h1)

接收方: h2=H(M)

          h1= DKPA(h’)

如果h1=h2则表明接收方收到的消息确实是发送方发送的,而且还可以确定此消息没有被修改过.

二、数字信封

发送方用一个随机产生的DES密钥加密原始数据(消息),然后用接受方的公钥加密DES密钥,称为消息的数字信封。将数字信封同DES加密的消息一起发送给接受方,接受者在接收到消息后,先用其私钥对数字信封进行解密(打开数字信封),得到发送方的DES密钥,再用此密钥去解密消息。只有用接受方的RSA私钥才能打开数字信封,这样确保了接受者的身份。

用表达式表示如下:

发送方:C1=EKDES(M)

        C2=EKPB(KDES)

接收方: KDES=DKSB(C2)

         M= DKDES(C1)

数字信封既克服了两种加密体制的缺点,发挥了两种密码体制的优点,又妥善解决了密钥传送的安全问题。

### 结合使用数字信封数字签名 为了确保消息的真实性保密性,在实际应用中可以将数字信封数字签名相结合。这种方式不仅能够保证信息传输过程中的安全性,还能验证发送者的身份以及确保信息未被篡改。 #### 实现流程 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、付费专栏及课程。

余额充值