密码学~~~数字信封

article/2025/9/4 19:34:06

#本文仅供参考有不足之处请指出

一、概括

        数字信封是公钥密码体制在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。数字信封的功能类似于普通信封,普通信封在法律的约束下保证只有收信人才能阅读信的内容;数字信封则采用密码技术保证了只有规定的接收人才能阅读信息的内容。数字信封中采用了对称密码体制和公钥密码体制。信息发送者首先利用随机产生的对称密码加密信息,再利用接收方的公钥加密对称密码,被公钥加密后的对称密码被称之为数字信封。在传递信息时,信息接收方若要解密信息,必须先用自己的私钥解密数字信封,得到对称密码,才能利用对称密码解密所得到的信息。这样就保证了数据传输的真实性和完整性。

        在一些重要的电子商务交易中密钥必须经常更换,为了解决每次更换密钥的问题,结合对称加密技术和公开密钥技术的优点,它克服了私有密钥加密中私有密钥分发困难和公开密钥加密中加密时间长的问题,使用两个层次的加密来获得公开密钥技术的灵活性和私有密钥技术高效性。信息发送方使用密码对信息进行加密,从而保证只有规定的收信人才能阅读信的内容。采用数字信封技术后,即使加密文件被他人非法截获,因为截获者无法得到发送方的通信密钥,故不可能对文件进行解密。

二、原理

        实现发送方和接收方之间文件的加密传输,使之具有保密性、不可否认性和完整性。

1、发送方A操作

(1)与接收方B预先协商好通信过程中所使用到的对称加密算法、非对称加密算法和哈希函数;

(2)采用对称加密算法(密钥称之为会话密钥)对传输信息进行加密得到密文,确保传输信息的保密性;

(3)采用哈希函数(生成文件摘要)确保传输信息的完整性,并使用自己的私钥对文件摘要进行签名(得到数字签名),确保信息发送方的不可否认性;

(4)使用接受方B的公钥对会话密钥进行加密,确保传输信息的保密性以及信息接收方的不可否认性;

(5)将密文、加密后的会话密钥和数字签名打包封装(放到一起)后,通过网络传输给接收方B。

2、接收方B操作

(1)与发送方A预先已协商好的通信过程中使用到的对称加密算法、非对称加密算法和哈希函数;

(2)使用自己的私钥对发送方A加密的会话密钥进行解密,得到会话密钥;

(3)使用会话密钥对得到的密文进行解密,得到明文;

(4)使用发送方A的公钥对得到的数字签名进行解密,得到明文摘要;

(5)使用哈希函数计算得到的明文摘要,将计算得到的摘要与准明文摘要进行比较,若相同则表明文件安全传输成功。

        具体流程如图所示:

 三、设计内容

3.1设计环境

系统环境开发工具设计语言
windows10

PyCharm

Python3.8

3.2概要设计

        为了能够模拟出数字信封的发送和接受过程,这里基于python程序采用目录分类的形式来呈现,具体目录结构如图 所示:

        

         这里将目录文件主要分为了三类,分别是代表消息发送者的sender、消息接受者的receiver以及所传输的消息文件message,在初始状态下,sender目录下包含了所要发送的数据文件data.txt、消息发送的主要程序sender.py、主要加、解密算法和签名算法的类文件CryptoTest.py、对称算法AES的密钥文件aeskey.txt以及非对称算法RSA的公钥和私钥(这里指的是:发送者A的私钥文件Aprikey.bin和接受者B的公钥文件Bpubkey.bin),而接受者receiver目录下只包含了消息接受的主要程序receiver.py、主要加、解密算法和签名算法的类文件CryptoTest.py、以及非对称算法RSA的公钥和私钥(这里指的是:发送者A的公钥文件Apubkey.bin和接受者B的私钥文件Bprikey.bin),由于还未发送消息,所以message目录下为空,其中RSA的公钥和私钥是由produce_key.py程序生成,具体的发送运行流程如运行结果中所示。

3.3详细设计

3.3.1CryptoTest.py(包含AES、RSA加解密算法和哈希运算)

from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex
import hashlib,base64
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
class aestest():#AES对称密码算法加解密def __init__(self, key):self.key = keyself.mode = AES.MODE_CBCdef encrypt(self, text):#AES加密cryptor = AES.new(self.key, self.mode, self.key)# 实例化加密套件,使用CBC模式text = text.encode("utf-8")length = 16count = len(text)add = length - (count % length)text = text + (b'\0'*add)#对明文进行编码转换,长度不够就补0self.ciphertext = cryptor.encrypt(text)#对明文进行aes加密entext = b2a_hex(self.ciphertext).decode("utf-8")#对加密后的文件进行编码转换with open('../message/ciphertext.bin', 'w') as f1:#eiphertext.bin密文文件f1.write(entext)return entextdef decrypt(self, text):#AES解密cryptor = AES.new(self.key, self.mode, self.key)# 实例化加密套件,使用CBC模式plain_text = cryptor.decrypt(a2b_hex(text))#对密文进行解密plaintext = plain_text.rstrip(b'\0').decode("utf-8")#对删除补的0,编码转换得到明文with open('plaintext.bin', 'w') as f2:f2.write(plaintext)return plaintext
class rsatest():#RSA公钥算法加解密def encrypt(self,file,encryptedfile,pubk):with open(file,'rb') as f:recipient_key = RSA.import_key(open(pubk).read())#从文件中获取获取公钥cipher_rsa = PKCS1_OAEP.new(recipient_key)# 实例化加密套件c= cipher_rsa.encrypt(f.read())# 加密with open(encryptedfile,'wb') as out_file:#保存加密文件out_file.write(c)def decrypt(self,file,decryptedfile,prik):with open(file,'rb') as f:private_key = RSA.import_key(open(prik).read())#从文件中获取获取私钥cipher_rsa = PKCS1_OAEP.new(private_key)# 实例化加密套件m = cipher_rsa.decrypt(f.read())#解密with open (decryptedfile,'wb') as out_file:#保存解密文件out_file.write(m)
# hash类
class hashtest():#做哈希运算hash = hashlib.sha256()hash.update('admin'.encode('utf-8'))
class signverify:def sign(self, data, privkeyfile, sigfile):privkey = open(privkeyfile, "rb").read().decode("utf-8")# 读取私钥key = RSA.importKey(privkey)data1 = open(data, "rb").read()# 要签名的内容h = SHA256.new(data1)# 获取要签名的内容的HASH值。signer = PKCS1_v1_5.new(key)# 对HASH值使用私钥进行签名。signature = signer.sign(h)sig = base64.b64encode(signature)#对签名进行base64加密with open(sigfile, "wb") as f:f.write(sig)def verify(self, data, pubkeyfile, sigfile):publickey = open(pubkeyfile, "rb").read().decode("utf-8")# 读取公钥key = RSA.importKey(publickey)data1 = open(data, "rb").read()h = SHA256.new(data1)# 获取被签名的内容的HASH值。verifier = PKCS1_v1_5.new(key)signature = open(sigfile, "rb").read().decode('utf-8')if verifier.verify(h, base64.b64decode(signature)):return Truereturn False

3.3.2produce_key.py(生成A、B公钥和私钥)

import rsa
f, e = rsa.newkeys(2048)  # 生成公钥、私钥
e = e.save_pkcs1()  # 保存
with open("./sender/Aprikey.bin", "wb") as x:  # 保存A私钥x.write(e)
f = f.save_pkcs1()  # 保存为格式
with open("./receiver/Apubkey.bin", "wb") as x:  # 保存A公钥x.write(f)
p,b = rsa.newkeys(2048)  # 生成公钥、私钥
b = b.save_pkcs1()  # 保存
with open("./receiver/Bprikey.bin", "wb") as x:  # 保存B私钥x.write(b)
p = p.save_pkcs1()  # 保存为 格式
with open("./sender/Bpubkey.bin", "wb") as x:  # 保存B公钥x.write(p)

3.3.3​​​​​​​sender.py(发送者)

import CryptoTest#发送方A的三步,发送方A已经获得接受方B的公钥Bpubkey.bin
#第一步用AES对称密钥加密明文文件
with open('aeskey.txt','rb') as f:aessymkey = f.read()
Aaestest = CryptoTest.aestest(aessymkey)#实例化对象
print('请输入要加密的明文文件')
fname = input()#请输入要加密的明文文件
with open(fname,'r') as f:m =f.read()Aaestest.encrypt(m)#AES的CBC模式加密
print('明文文件加密后的密文文件是ciphertext.bin')
#第二步用对方公钥Bpubkey.bin加密,对称文件aeeskey.txt
Arsa = CryptoTest.rsatest()
Arsa.encrypt('aeskey.txt','../message/keyencrypted.bin','Bpubkey.bin')
print('对称密钥文件aeskey.txt加密后的文件是keyencrypted.bin')
#第三步生成明文文件的摘要值,用自己的私钥Aprikey.bin对摘要进行数字签名
asgin = CryptoTest.signverify()
asgin.sign('data.txt','Aprikey.bin','../message/digitalsign.bin')
print('A签名后的文件是digitalsign.bin')
print('将三个文件ciphertext.bin,keyencrypted.bin,digitalsign.bin发送给B')

3.3.4​​​​​​​receiver.py(接受者)

import CryptoTest#接收方B的三步,接收方已经获得了发送方A的公钥Apubkey.bin
#第一步用自己的私钥解密得到对称密钥
Brsa = CryptoTest.rsatest()
Brsa.decrypt('../message/keyencrypted.bin','aeskey.txt','Bprikey.bin')
print('解密后的密钥文件是aeskey.txt')
with open('aeskey.txt','r',encoding = 'utf-8') as f:
p = f.read()
print('会话密钥是:'+p)
#第二步用对称密钥解密密文
with open('aeskey.txt','rb') as f:aessymkey = f.read()
Baestest2 = CryptoTest.aestest(aessymkey)
with open('../message/ciphertext.bin','r') as f:m = f.read()Baestest2.decrypt(m)
print('解密后明文文件是plaintext.bin')
with open('plaintext.bin','r',encoding = 'utf-8') as f:p = f.read()print('明文信息是:'+p)
#第三步用A的公钥解密数字签名验证摘要值
bverify = CryptoTest.signverify()
print(bverify.verify('plaintext.bin','Apubkey.bin','../message/digitalsign.bin'))
if (bverify.verify('plaintext.bin','Apubkey.bin','../message/digitalsign.bin')):print('验证签名正确')
else:print('验证错误')

3.3.5data.txt和aeskey.txt(测试用,可以更改,aeskey长度16位) 

     

3.4运行结果

1、先运行CryptoTest.py和produce_key.py(在sender和receiver里生成相应的公钥私钥)

2、再运行sender,py结果如下图

 此时message目录下生成了所发送的消息(数字信封)

 3、最后运行receiver.py结果如下图

4、运行开始和运行结束后的目录如图 

 


http://chatgpt.dhexx.cn/article/jliWphDm.shtml

相关文章

数字信封工作原理

数字信封是指发送方使用接收方的公钥来加密对称密钥后所得的数据,其目的是用来确保对称密钥传输的安全性。采用数字信封时,接收方需要使用自己的私钥才能打开数字信封得到对称密钥。 数字信封的加/解密过程如图1-19所示。甲也要事先获得乙的公钥&#xf…

RSA+AES数字信封加解密设计

登录认证、鉴权这些都做好了过后。就开始我们的加密设计了、这里采用了简化数字信封进行加密。首先客户端(浏览器)先请求一份RSA非对称密钥、如果我们采用了openresty或者有能力在nginx开发C模块的插件,就可以在这里保留一份用户的私钥&#…

数字信封加密

OpenSSL 是目前 PHP 甚至是整个开发圈中的数据加密事实标准,包括 HTTPS/SSL 在内的加密都是它的实际应用, OpenSSL 提供了对称和非对称加密的形式,也就是我们日常中最普遍的两种加密方式。 那么,它和 Hash 类的加密有什么不同吗&…

p7数字信封

PKCS7的数字信封格式分为两种:带签名的数字信封和不带签名的数字信封。由于这个数字信封的生成过程比较复杂,所以这两种格式比较容易记混,导致都搞不清楚一个数字信封里面到底是存储的什么内容了。下面我就详细的解释一下,这两种数…

数字信封原理

数字信封是指发送方使用接收方的公钥来加密对称密钥后所得的数据,其目的是用来确保对称密钥传输的安全性。采用数字信封时,接收方需要使用自己的私钥才能打开数字信封得到对称密钥。 数字信封的加/解密过程如图所示。甲也要事先获得乙的公钥,…

PKCS7数字信封简述

1、数字信封的概念 数字信封,英文是Digital Envelope,望文生义,就可以知道将需要传递的数据,通过加密的方式包裹起来。 数字信封的准确定义,在《PKCS #7: Cryptographic Message Syntax Standard》标准的第10章中给出,原话是:“加密的内容,以及对内容解密的密钥被加密…

什么是数字信封?

一、什么是数字信封 数字信封是公钥密码体制在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。 在数字信封中,信息发送方采用对称密钥来加密信息内容,然后将此对称密钥用接收方的公开密钥来加密(这…

数据来源渠道及采集工具_几款简单好用的爬虫抓取数据采集工具

新朋友点上方蓝字“Office交流网”快速关注 1. 火车头采集器 火车采集器我们也一直在用,是老牌的采集工具了。它不仅可做抓取工具,也可以做数据清洗、分析、挖掘已经可视化等工作。数据源可来源于网页,网页中能看到的内容和不可看到都可以通过…

爬虫抓取新浪微博数据

工具:云采爬虫 目标:抓取某个博主的全部微博 分析网页结构: 我们抓取的思路是模拟浏览器自动访问页面抓取。 我们来看一下页面结构,首先每个微博列表,必须进行三四次的下拉加载,如果底部有个翻页的按钮…

python3 爬虫抓取股市数据

python3 爬虫抓取股市数据 爬虫抓取数据的一般步骤代码运行结果小结注意事项 爬虫抓取数据的一般步骤 1、确定需要抓取的网站2、分析url,找到url的的变化规律3、分析页面的数据4、获取页面数据5、提取需要爬取的数据6、写入数据库或写入文件代码 import requests i…

Python_爬虫数据存入数据库(超详细过程

目录 一、新建项目 二、程序的编写 三、数据的爬取 一、新建项目 1.在cmd窗口输入scrapy startproject [项目名称] 创建爬虫项目 接着创建爬虫文件,scrapy genspider [爬虫名字] [爬虫域名] 打开pycharm项目,就可以看到生成的cblog.py文件 二、程序的…

爬虫抓取分页数据的简单实现

爬虫抓取分页数据的简单实现 昨天,我们已经利用Jsoup技术实现了一个简单的爬虫,原理很简单,主要是要先分析页面,拿到条件,然后就去匹配url,采用dome解析的方式循环抓取我们需要的数据,从而即可轻…

PHP爬虫抓取网页数据

2019年我接触到PHP爬虫的时候,我最开始是懵的。还有人用php来写爬虫? 一个月之后,嗯~全世界最好的语言写全世界最好的爬虫,真香!而在7月15这一个日常加班的晚上,做完手头的活,我寻思着写会儿php…

网络爬虫的基本结构是什么?如何建立网络爬虫抓取数据?

摘要:互联网上有很多丰富的信息可以被抓取并转换成有价值的数据集,然后用于不同的行业。比如企业用户利用电商平台数据进行商业分析,学校的师生利用网络数据进行科研分析等等。那么,除了一些公司提供的一些官方公开数据集之外&…

利用EXCEL进行数据爬虫

说到爬虫,相信大家出现在脑海中的一定是python。python在最近几年确实热火朝天,对于不会编程人员来说,利用好EXCEL一样也可以爬取一些简单的数据,并且方式非常简单。 1.爬取东方财富网上基金信息。网址为:基金收益排行…

利用Excel数据爬虫

1、在Excel里数据里打开自网站。 2、选择高级部分 URL部分和URL预览填写为目标(需要爬取数据的网址)的URL地址 命令超时选择1分钟即可。 HTTP请求标头参数 第一步点击网络 第二部点击消息头部 第三部找到User-Agent的value复制 3、最后点击加载 就…

爬虫抓取网络数据时经常遇到的六种问题

随着互联网时代的不断发展,爬虫采集已经成为了目前最为主流的数据获取方式。使用爬虫软件自动从网站中提取数据可以节省大量的时间和精力。接下来就一起来看看爬虫抓取网络数据时经常遇到的六种问题吧: 1.IP阻止 IP阻止是指网站所有者主动阻止用户的IP地…

Jsoup实现网络爬虫抓取数据

Jsoup实现网络爬虫抓取数据 在编写一个软件,例如关于教务软件的时候,需要获取学校官网的一些新闻信息来充实自己的软件,而又不会专门提供相关的api接口,此时就需要我们自己动手来抓取感兴趣的信息。有人会问抓取网站的信息是否会…

Java爬虫,数据采集经验分享

公司要求我采集网页中的某些数据,以下是我采集的步骤和思路,比较基础。 一.首先我是通过抓取网页源代码的方式,根据源代码,获取各种标签中的数据 public class GetData {//数据抓取核心类// 获取网页数据/** param url:目标网址…

Python爬虫抓取数据时怎么防止ip被封

大数据公司在做数据分析的时候,对目标网站频繁访问很容易触发网站的反爬机制,因此如果想要突破限制只能使用动态ip频繁切换地址模拟真实客户访问网站才能起到防封效果。比如在做数据抓取的时候报错403等限制访问,大概率是因为ip被限。本文总结…