什么是数字信封?

article/2025/9/4 22:38:25

一、什么是数字信封

  数字信封是公钥密码体制在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。

  在数字信封中,信息发送方采用对称密钥来加密信息内容,然后将此对称密钥用接收方的公开密钥来加密(这部分称数字信封)之后,将它和加密后的信息一起发送给接收方,接收方先用相应的私有密钥打开数字信封,得到对称密钥,然后使用对称密钥解开加密信息。这种技术的安全性相当高。数字信封主要包括数字信封打包和数字信封拆解,数字信封打包是使用对方的公钥将加密密钥进行加密的过程,只有对方的私钥才能将加密后的数据(通信密钥)还原;数字信封拆解是使用对称密钥解密将加密过的数据解密的过程。

  对称加密和非对称加密各有千秋。对称加密实现简单,加解密速度快,非对称加密算法牢固,容易实现数字签名,但是加解密速度稍慢,所以一般情况下,将对称加密和非对称加密结合起来应用,就可以达到良好的加密效果。典型的应用之一就是电子信封。

二、数字信封优点

  数字信封是一种综合利用了对称加密技术和非对称加密技术两者的优点进行信息安全传输的一种技术。数字信封既发挥了对称加密算法速度快、安全性好的优点,又发挥了非对称加密算法密钥管理方便的优点。

三、代码实现

1.对称加密实现,这里采用的是3des加密

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

/*** 对称加密*/
public class DES3Utils {// 向量private final static String iv = "01234567";// 加解密统一使用的编码方式private final static String encoding = "utf-8";/*** 3DES加密** @param plainText 普通文本* @return* @throws Exception*/public static String encode(String plainText,String secretKey) throws Exception {Key deskey = null;DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");deskey = keyfactory.generateSecret(spec);Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");IvParameterSpec ips = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));return Base64.encode(encryptData);}/*** 3DES解密** @param encryptText 加密文本* @return* @throws Exception*/public static String decode(String encryptText,String secretKey)  {try {Key deskey = null;DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");deskey = keyfactory.generateSecret(spec);Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");IvParameterSpec ips = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.DECRYPT_MODE, deskey, ips);byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));return new String(decryptData, encoding);}catch (Exception e){return "";}}}

2.非对称加密实现,这里采用的是RSA加密

RSA是目前使用最广泛的公钥密码体制之一。它是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法的安全性基于RSA问题的困难性,也就是基于大整数因子分解的困难性上。但是RSA问题不会比因子分解问题更加困难,也就是说,在没有解决因子分解问题的情况下可能解决RSA问题,因此RSA算法并不是完全基于大整数因子分解的困难性上的。

/*** 非对称加密*/
public class RSA {private static final String ALGO = "RSA";private static final String CHARSET = "UTF-8";/** 用于存储随机产生的公钥与私钥*/public static Map<Integer, String> KEY_CACHE = new HashMap<>();/*** 随机生成密钥对** @throws NoSuchAlgorithmException*/public static void generateKeyPair() throws NoSuchAlgorithmException {// KeyPairGenerator 类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGO);// 初始化密钥对生成器,密钥大小为 96-1024 位keyPairGen.initialize(1024, new SecureRandom());// 生成一个密钥对,保存在 keyPair 中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));// 将公钥和私钥保存到 MapKEY_CACHE.put(0, publicKeyString);KEY_CACHE.put(1, privateKeyString);}/*** RSA公钥加密** @param data       加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/public static String encrypt(String data, String publicKey) throws Exception {// base64 编码的公钥byte[] decoded = Base64.getDecoder().decode(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(ALGO).generatePublic(new X509EncodedKeySpec(decoded));// RSA加密Cipher cipher = Cipher.getInstance(ALGO);// 公钥加密cipher.init(Cipher.ENCRYPT_MODE, pubKey);return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes(CHARSET)));}/*** RSA私钥解密** @param data        加密字符串* @param privateKey 私钥* @return 铭文* @throws Exception 解密过程中的异常信息*/public static String decrypt(String data, String privateKey) throws Exception {byte[] inputByte = Base64.getDecoder().decode(data.getBytes(CHARSET));// base64 编码的私钥byte[] decoded = Base64.getDecoder().decode(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(ALGO).generatePrivate(new PKCS8EncodedKeySpec(decoded));// RSA 解密Cipher cipher = Cipher.getInstance(ALGO);// 私钥解密cipher.init(Cipher.DECRYPT_MODE, priKey);return new String(cipher.doFinal(inputByte));}
}

3.测试

//=================数据传输加密======================
//第一步:获取要加密的数据
String data = "{dano:1256,eugo:6521}";
//第二步:生成对称加密密钥(随机生成了一串字符串)
String miyao = generateString(28);
//第三步:通过对称密钥 加密传输数据
String csData=DES3Utils.encode(data, miyao);
//第四步:通过RSA公钥加密 对称密钥
generateKeyPair();
String csKey=RSA.encrypt(miyao, KEY_CACHE.get(0));
//第五步:返回数据
Map<String,String> toMap=new HashMap<>(16);
toMap.put("data",csData);
toMap.put("key",csKey);
//=================数据接收解密======================
//第一步:获取加密后的数据
String Data=toMap.get("data");
//第二步:获取加密后的对称密钥
String key=toMap.get("key");
//第三步:通过RSA公钥解密 对称密钥
String jmKey=RSA.decrypt(key, KEY_CACHE.get(1));
//第四步:通过对称密钥 解密加密数据
String jmData=DES3Utils.decode(Data, jmKey);
System.out.println(jmData);


 


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

相关文章

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

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

爬虫抓取新浪微博数据

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

python3 爬虫抓取股市数据

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

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

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

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

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

PHP爬虫抓取网页数据

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

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

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

利用EXCEL进行数据爬虫

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

利用Excel数据爬虫

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

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

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

Jsoup实现网络爬虫抓取数据

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

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

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

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

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

爬虫入门——数据抓取

学习爬虫&#xff0c; 最初的操作便是模拟浏览器向服务器发出请求。使用一下库实现此请求 1.urllib库的使用 urllib 库是Python 内置的HTTP 请求库&#xff0c;包含以下四个模块&#xff1a; 1.request&#xff1a;http请求模块 2.error&#xff1a;异常处理模块 3.parse&#…

ts全局变量定义

参照已有全局变量定义 src/global.d.ts /** Author: hongbin* Date: 2022-10-21 08:49:42* LastEditors: hongbin* LastEditTime: 2022-10-21 09:09:08* Description:全局类型&#xff0c;变量&#xff0c;常量*/ //全局变量 declare let Hong: string; declare const BIN: s…

C++中的全局变量声明和定义

1.全局变量 全局变量在整个源文件的作用域都是有效的&#xff0c;只需要在一个源文件中定义全局变量&#xff0c;在其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。 也可以在一个源文件中定义这个全局变量&#xff0c;在头文件中用extern关键字再…

c语言全局变量(c语言全局变量怎么定义)

菜鸟提问:GCCE编译环境下&#xff0c;汇编函数如何使用C全局变量汇编化了 首先要在C程序中用extern申明该变量为全局变量&#xff0c;再在汇编程序中用extern "变量名"来导入&#xff0c;注意&#xff0c;汇编中如果直接使用"mov eax,变量名"表示的是将该变…

C++全局变量的声明和定义

参考&#xff1a; http://wrchen.blog.sohu.com/71617539.html &#xff08;1&#xff09;编译单元&#xff08;模块&#xff09; 在VC或VS上编写完代码&#xff0c;点击编译按钮准备生成exe文件时&#xff0c;编译器做了两步工作&#xff1a; 第一步&#xff0c;将每个.cpp(.c…

【Vue】全局变量的定义及使用

首先声明Vue使用全局变量的方法有很多&#xff0c;以下只是个人觉得比较简洁的2种。其中两者的第一步操作相同&#xff0c;即&#xff1a; 创建全局变量文件Global.vue&#xff0c;内容如下&#xff1a; <script>const name ZhangSan; //名称const address No.20, Ta…

VC++中全局变量的问题(转)

全局变量一般这样定义&#xff1a;1。在一类的.cpp中定义 int myInt;然后再在要用到的地方的.cpp里extern int myInt&#xff1b;这样就可以用了。 2。在stdafx.cpp中加入:int myInt;然后在stdafx.h中加入:extern int myInt这样定义以后无论在什么文件中都是可见的. 3。比较规…