PKCS7的数字信封格式分为两种:带签名的数字信封和不带签名的数字信封。由于这个数字信封的生成过程比较复杂,所以这两种格式比较容易记混,导致都搞不清楚一个数字信封里面到底是存储的什么内容了。下面我就详细的解释一下,这两种数字信封的生成过程和其详细的数据结构。
不带签名的数字信封:
不带签名的数字信封内容类型由任意类型的加密内容和加密的一个/多个接收者的内容加密密钥组成,其生成过程如下:
1. 发送方随机产生一个对应于特定加密内容加密密钥。
2. 发送方将内容加密密钥用每个接收者的公钥加密。
3. 对于每一个接收者,把加了密的内容加密密钥和接收者的其他信息放入RecipientInfo值中。
4. 用内容加密密钥加密内容。
5. 将所有接收者的RecipientInfo值和加了密的内容放入EnvelopedData值中。
发送给接收方后,解包的过程很简单:接收者用自己的私钥解开加密的内容加密密钥,然后用该密钥解密密文内容。整个过程参与非对称运算的只有接收方的密钥对。
带签名的数字信封:
带签名的数字信封由任意类型的加密内容、加了密的一个/多个接收者的内容加密密钥和双重加密的一个/多个签名者的消息摘要。“双重加密”由签名者私钥的加密和内容加密密钥的加密组成。其生成过程如下:
下图为简单流程:

代码示例:
/ * @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
