数字信封

2024-03-15 21:36
文章标签 数字 信封

本文主要是介绍数字信封,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概念

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

二、过程描述

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

三、图解

数字信封流程说明

四、代码示例

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.chinasem.cn/article/813335

相关文章

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

AIGC6: 走进腾讯数字盛会

图中是一个程序员,去参加一个技术盛会。AI大潮下,五颜六色,各种不确定。 背景 AI对各行各业的冲击越来越大,身处职场的我也能清晰的感受到。 我所在的行业为全球客服外包行业。 业务模式为: 为国际跨境公司提供不同地区不同语言的客服外包解决方案,除了人力,还有软件系统。 软件系统主要是提供了客服跟客人的渠道沟通和工单管理,内部管理跟甲方的合同对接,绩效评估,BI数据透视。 客服跟客人

NC 把数字翻译成字符串

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。 现在给一串数字,返回有多少种可能的译码结果 import java.u

34465A-61/2 数字万用表(六位半)

34465A-61/2 数字万用表(六位半) 文章目录 34465A-61/2 数字万用表(六位半)前言一、测DC/AC电压二、测DC/AC电流四、测电阻五、测电容六、测二极管七、保存截图流程 前言 1、6位半数字万用表通常具有200,000个计数器,可以显示最大为199999的数值。相比普通数字万用表,6位半万用表具有更高的测量分辨率和更高的测量准确度,适用于精度比较高的测

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html