数字签名和数字信封

数字签名

定义

用户用自己的【私钥】对原始数据的哈希摘要进行加密所得的数据。

原理

用户A将待发送的信息原文经散列函数运算生成摘要信息,并用自己的私有密钥对摘要信息进行加密,将形成的密文和原文传送给用户B。用户B接收到密文后,使用A的公开密钥验证密文,得到摘要信息,并按照约定的摘要算法对原文进行摘要运算,再将两个摘要值进行比对,一致则表明数据未被篡改。
在这里插入图片描述

作用

对用户的身份认证,保证了数据在传输过程中的完整性、和交易的不可否认性;

签名种类

  • P7签名又分为两类:

  • Attached签名

将原文数据、签名证书、签名证书算法、签名数据封装成签名数据。因此,在验签的时候只提供签名结果就可以。

  • Detached签名

将签名证书、签名算法、签名数据封装成签名数据。注:没有原文信息,因此,在验签的时候不光提供签名结果,还要提供明文。

  • P1签名也称为裸签

只包含纯碎的签名结果。因此,在验签的时候,提供签名结果,提供明文和签名证书三种数据。

验证签名

验签的原理

用加签相通的hash算法得到摘要A,然后根据公钥对签名结果解密得到摘要B。对比摘要A和摘要B是否相通。
在这里插入图片描述

数字信封

定义

是将对称密钥通过非对称加密(即:有公钥和私钥两个)的结果分发对称密钥的方法。数字信封是实现信息完整性验证的技术。

原理

首先,用户A使用由计算机随机生成的一组一次使用的对称密钥——会话密钥(Session Key)加密信息原文,形成密文,然后使用用户B的公开密钥对会话密钥进行加密,并将加密的会话密钥附在密文后一起发送给用户B;用户B在接收到密文和加密的会话密钥后,先用自己对应的私钥解密得出会话密钥,然后再用会话密钥解密密文,最终获得信息原文
在这里插入图片描述

作用

用户传输数据的。因为对称加密的处理性能比非对称加密要快,所以这样可以提高了服务的性能。再用非对称加密对对称密钥加密,这样保证了数据的安全性。

签名 、数字信封、证书的关系

三者没有任何的关系!!三者没有任何的关系!!三者没有任何的关系!!他们三个的作用是不同的。
签名:是为了验证身份的;
信封:是为了传输信息的;
证书:是承载公钥和发布者一些信息的。
他们作用不同,所以没有必然的联系!!!

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

余额充值