数字信封

一、概念

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

二、过程描述

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

三、图解

数字信封流程说明

四、代码示例

a.引入依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version>
</dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.69</version>
</dependency>

b.代码

import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SM4;
import java.io.Serializable;
import java.security.PrivateKey;
import java.security.PublicKey;/*** @Author 乐hh* @Description 数字信封测试**/
public class EnvelopeTest {public static void main(String[] args) {// 1.接收方生成一对公私钥(使用国密算法SM2)SM2 sm2 = SmUtil.sm2();PublicKey publicKey = sm2.getPublicKey(); // 公钥用于发送方加密PrivateKey privateKey = sm2.getPrivateKey(); // 私钥用于接收方解密// 2.发送方使用接收方的公钥生成数字信封Envelope envelope = generateEnvelope(publicKey);// 3.接收方使用私钥解密数字信封String message = openEnvelope(privateKey, envelope);System.out.println("信件内容:" + message);}/*** 生成数字信封* * @param publicKey SM2公钥* @return 数字信封*/private static Envelope generateEnvelope(PublicKey publicKey) {// 信件内容final String message = "Hello world!";// 使用对称密钥加密信件内容(使用国密算法SM4)SM4 sm4 = SmUtil.sm4();byte[] key = sm4.getSecretKey().getEncoded();String messageCipher = sm4.encryptBase64(message);// 使用公钥加密对称密钥SM2 sm2 = new SM2(null, publicKey);String keyCipher = sm2.encryptBase64(key, KeyType.PublicKey);return new Envelope(messageCipher, keyCipher);}/*** 打开数字信封** @param privateKey SM2私钥* @param envelope   数字信封* @return 信封内容*/private static String openEnvelope(PrivateKey privateKey, Envelope envelope) {// 使用私钥解密得到对称密钥SM2 sm2 = new SM2(privateKey, null);byte[] key = sm2.decrypt(Base64Decoder.decode(envelope.getKeyCipher()), KeyType.PrivateKey);// 使用对称密钥解密得到信件内容SM4 sm4 = new SM4(key);byte[] message = sm4.decrypt(Base64Decoder.decode(envelope.getMessageCipher()));return new String(message);}static class Envelope implements Serializable {/*** 信件内容密文(Base64编码)*/private String messageCipher;/*** 对称密钥密文(Base64编码)*/private String keyCipher;public Envelope(String messageCipher, String keyCipher) {this.messageCipher = messageCipher;this.keyCipher = keyCipher;}public String getMessageCipher() {return messageCipher;}public void setMessageCipher(String messageCipher) {this.messageCipher = messageCipher;}public String getKeyCipher() {return keyCipher;}public void setKeyCipher(String keyCipher) {this.keyCipher = keyCipher;}}
}

c.运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541221.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二证券|AIGC行业新突破不断 文化传媒板块活跃

本周以来&#xff0c;以短剧、游戏为代表的文明传媒板块实现三连涨。3月13日&#xff0c;游戏股逆势大涨&#xff0c;游戏出海、网络游戏、短剧游戏方向领涨。到收盘&#xff0c;因赛集团以20%幅度涨停&#xff0c;掌趣科技涨超10%&#xff0c;凯撒文明、中广天择、时代出书、大…

ansible 部署FATE集群单边场景

官方文档&#xff1a; https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_FATE_manual.md https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_two_sides.md gitee详细文档&#xff1a; docs/ansible_deploy_one_side.md…

使用docker-compose部署Redis集群

一、部署三主三从的Redis集群 分别为6个节点建立挂载目录&#xff0c;每个目录下建立数据、配置、日志文件夹。 docker-compose内容如下&#xff1a; version: 3 services:redis1:image: redis:6.2.3restart: alwaysports:- "6379:6379"- "16379:16379"v…

短剧APP系统开发:打造全新的掌上剧场体验

随着移动互联网的普及和人们娱乐方式的多样化&#xff0c;短剧已经成为现代人生活中不可或缺的一部分。为了满足用户对高质量、便捷观看短剧的需求&#xff0c;我们致力于开发一款功能全面、操作简便的短剧APP系统&#xff0c;为用户带来前所未有的掌上剧场体验。 一、系统开发…

教你如何用Python生成随机数字和随机字符串

直接看代码 随机整数&#xff1a; >>> import random >>> random.randint(0,99) 21 随机选取0到100间的偶数&#xff1a; >>> import random >>> random.randrange(0, 101, 2) 42 随机浮点数&#xff1a; >>> import random >…

【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 二叉树的前序遍历2. 二叉树的中序遍历3. 二叉树的后序遍历 1. 二叉树的前序遍历 点击查看题目 根…

ChatGPT终于有身体了

目录 一、开启 AI 机器人新纪元&#xff1a;Figure 01 的惊艳亮相 二、网友热议与技术探索&#xff1a;Figure 01 的广泛影响 三、未来展望&#xff1a;人形机器人与日常生活的融合 一、开启 AI 机器人新纪元&#xff1a;Figure 01 的惊艳亮相 在人工智…

18 OpenCV霍夫变换检测直线

文章目录 HoughLines 算子HoughLinesP 算子示例 HoughLines 算子 cv::HoughLines( InputArray src, // 输入图像&#xff0c;必须8-bit的灰度图像 OutputArray lines, // 输出的极坐标来表示直线 double rho, // 生成极坐标时候的像素扫描步长 double theta, //生成极坐标时候…

【阿里云系列】-部署ACK集群的POD应用日志如何集成到日志服务(SLS)中

介绍 我们在实际部署应用到阿里云的ACK集群后&#xff0c;由于后期应用服务的持续维护诉求可能需要跟踪排查问题&#xff0c;此时就要具备将应用的历史日志存档便于后期排查问题 处理方式 为了解决以上的普遍需求&#xff0c;需要将ACK中的应用日志采集到SLS的Logstore中,然…

使用CIP采集欧姆龙EtherNet/IP从入门到精通

本文将会从以下几个方面介绍 1.CIP是什么 2.EtherNet/IP通信是什么 3.CIP通信报文解析 4.使用CIP常用的方法和功能介绍&#xff08;UCMM&#xff09; 5.自己封装了一个类&#xff0c;只要知道标签名称&#xff0c;和数据类型即可读写数据 6.demo展示 1.CIP是什么 CIP通信…

CSS:过渡动画 (Transition)与关键帧动画(Keyfram)

一、过渡动画 (Transition) 1.简单介绍 Transition能为样式的变化提供过渡效果&#xff0c;例如在下面的代码中&#xff1a; .main {width: 300px;height: 100px;background-color: #d26f6f;}.main:hover {width: 300px;height: 200px;background-color: #5e3e3e;transition:…

关于如何重燃学习的激情

3月1日是我回学校的第一天。经历了长达8个月在家的昏暗时刻&#xff0c;我这10天的感觉和在家的感觉发生了翻天覆地的变化&#xff0c;最明显的莫过于学习状态的改变。 倒不是说在家学的不好&#xff0c;而是说在学校&#xff0c;我对学习的整体感觉&#xff0c;以及专注程度&…