p7数字信封

p7数字信封PKCS7 的数字信封格式分为两种 带签名的数字信封和不带签名的数字信封 由于这个数字信封的生成过程比较复杂 所以这两种格式比较容易记混 导致都搞不清楚一个数字信封里面到底是存储的什么内容了 下面我就详细的解释一下 这两种数字信封的生成过程和其详细的数据结构 不带签名的数字信封 不带签名的数字信封内容类型由任意类型的加密内容和加密的一个 多个接收者的内容加密密钥组成 其生成过程如下 1 发送方

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

不带签名的数字信封:
不带签名的数字信封内容类型由任意类型的加密内容和加密的一个/多个接收者的内容加密密钥组成,其生成过程如下:
1. 发送方随机产生一个对应于特定加密内容加密密钥。
2. 发送方将内容加密密钥用每个接收者的公钥加密。
3. 对于每一个接收者,把加了密的内容加密密钥和接收者的其他信息放入RecipientInfo值中。
4. 用内容加密密钥加密内容。
5. 将所有接收者的RecipientInfo值和加了密的内容放入EnvelopedData值中。












发送给接收方后,解包的过程很简单:接收者用自己的私钥解开加密的内容加密密钥,然后用该密钥解密密文内容。整个过程参与非对称运算的只有接收方的密钥对。

带签名的数字信封:
带签名的数字信封由任意类型的加密内容、加了密的一个/多个接收者的内容加密密钥和双重加密的一个/多个签名者的消息摘要。“双重加密”由签名者私钥的加密和内容加密密钥的加密组成。其生成过程如下:

下图为简单流程:

p7数字信封

代码示例:

/ * @param publicKey 公钥对象 * @param orgData 原文 * @return Result if(code== 200)success else fail * encryptFileStr 加密后的字符串 * encryptKeyStr 加密后的秘钥字符串 * @throws UnsupportedEncodingException * @throws NoSuchProviderException * @throws NoSuchAlgorithmException */ public static Result strEncrypt(PublicKey publicKey,String orgData) throws UnsupportedEncodingException { try { //创建对称秘钥对 byte[] key = Sm4Utils.generateKey(); //对加密 byte[] fileEncryptBytes = Sm4Utils.encrypt_ECB_Padding(key, orgData.getBytes(charset)); //对秘钥对加密 byte[] encryptKey = SM2Util.encrypt((BCECPublicKey)publicKey, key); //将返回值base64加密 String encryptDataStr = Base64Utils.encode(fileEncryptBytes); String encryptKeyStr = Base64Utils.encode(encryptKey); return new Result(Result.CODE_SUCCESS,"加密成功", encryptDataStr,encryptKeyStr); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return new Result(Result.CODE_EXCEPTION, "NoSuchAlgorithmException,没有找到该摘要算法"); } catch (NoSuchProviderException e) { e.printStackTrace(); return new Result(Result.CODE_EXCEPTION, "NoSuchProviderException,没有找到该加密机"); }catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException | InvalidCipherTextException e ) { e.printStackTrace(); return new Result(Result.CODE_EXCEPTION, "加密失败:"+e.getMessage()); } }  

 参考:

https://blog.csdn.net/weixin_/article/details/

https://gitee.com/saxonkiku/encrypt_and_decrypt_file/blob/master/src/main/java/com/ymwk/StrEncrypt.java

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216049.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午12:40
下一篇 2026年3月18日 下午12:41


相关推荐

  • springboot安装ssl证书_一个ssl证书可以多个服务器用吗

    springboot安装ssl证书_一个ssl证书可以多个服务器用吗最近参与了一个微信小程序的项目,API要求服务器域名是Https的,所以研究了一下ssl证书在SpringBoot中的配置首先,到云服务提供商申请一套SSL证书,这里就不提供具体的申请流程了申请到证书之后下载证书现在Tomcat的进行下载,下载解压后有两个文件分别是.pfx后缀和.txt后缀的打开我们的项目(这里就不演示如何构建自己的基于SpringBoot的项目了)将.pfx…

    2026年4月15日
    5
  • 从零开始学 iOS 开发的15条建议「建议收藏」

    从零开始学 iOS 开发的15条建议「建议收藏」作者:清醒疯子利炳根授权本站转载。事情困难是事实,再困难的事还是要每天努力去做是更大的事实。因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发。跟粉丝群的朋友交流了一下,决定把之前的《18条建议》修改一下,这里统一回答一次。分三部分:第一部分:态度和电脑1、不要关注别人的学习经历,不要关注别人加薪经历

    2022年5月30日
    36
  • STM32通用定时器使用详解

    STM32通用定时器使用详解1 通用定时器基本介绍通用定时器包括 TIM2 TIM3 TIM4 和 TIM5STM32 通用定时器是一个通过可编程预分频器驱动的 16 位自动装载计数器构成 每个定时器都是完全独立的 没有互相共享任何资源 它们可以一起同步操作 定时器可以进行定时器基本定时 输出 4 路 PWM 输入捕获 本文利用定时器 3 展示并介绍这三个功能 2 开发环境开发平台 keil5 单片机型号 STM32F

    2026年3月19日
    3
  • SSH整合JPA+Mysql

    SSH整合JPA+Mysql

    2021年9月26日
    46
  • 记录一次成功的EC、BIOS降级操作[通俗易懂]

    记录一次成功的EC、BIOS降级操作[通俗易懂]记录一次成功的EC、BIOS降级操作(N1.0.16降至N1.0.7)笔记本型号:​ 机械革命X8ti操作环境:​ windows必备工具:DiskGeniusBIOS文件EFI启动文件(来源:机械革命)操作流程:打开DiskGenius,选中需要格式化的U盘,格式化FAT32(其他格式无效),分区表类型可以根据自身情况选择MBR还是GUID。…

    2022年7月20日
    36
  • LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)

    LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)

    2021年7月4日
    94

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号