Java 使用bouncycastle从CMS封装的数据中提取加密的会话密钥
我正在从事一个项目(Java),需求要求我们必须从第三方解密CMS信封。与此公钥对应的私钥存储在HSM中,不可导出。所以我所需要做的就是从CMS信封中提取加密的会话密钥并对其进行解密,然后使用解密的会话密钥对内容进行解密。 这个计划听起来很简单,唯一的问题是我不知道如何提取加密的会话密钥,如果bouncy castle中有办法,如果我提供解密的会话密钥,它将像使用软键一样对内容本身进行解密。感谢您为我指出测试案例。我在pkix包中没有找到任何东西,但在核心包中有一些测试用例,对我帮助很大。我能够使用这些库提取会话密钥和加密数据Java 使用bouncycastle从CMS封装的数据中提取加密的会话密钥,java,bouncycastle,hsm,Java,Bouncycastle,Hsm,我正在从事一个项目(Java),需求要求我们必须从第三方解密CMS信封。与此公钥对应的私钥存储在HSM中,不可导出。所以我所需要做的就是从CMS信封中提取加密的会话密钥并对其进行解密,然后使用解密的会话密钥对内容进行解密。 这个计划听起来很简单,唯一的问题是我不知道如何提取加密的会话密钥,如果bouncy castle中有办法,如果我提供解密的会话密钥,它将像使用软键一样对内容本身进行解密。感谢您为我指出测试案例。我在pkix包中没有找到任何东西,但在核心包中有一些测试用例,对我帮助很大。我能够
ContentInfo info=ContentInfo.getInstance(ASN1Primitive.fromByteArray(encryptedData));
EnvelopedData envData=EnvelopedData.getInstance(info.getContent());
ASN1Set s=envData.getRecipientInfos();
RecipientInfo RecipientInfo=RecipientInfo.getInstance(s.getObjectAt(0));
字节[]加密密钥;
if(recipientInfo.getInfo()KeyTransRecipientInfo的实例){
KeyTransRecipientInfo KeyTransRecipientInfo=KeyTransRecipientInfo.getInstance(recipientInfo.getInfo());
encryptedKey=keyTransRecipientInfo.getEncryptedKey().getOctets();
算法标识符keyEncryptionAlgorithm=keyTransRecipientInfo.getKeyEncryptionAlgorithm();
info(“对称加密算法:{}”,keyEncryptionAlgorithm.getAlgorithm().getId());
info(“八位加密密钥:{}”,Hex.toHexString(encryptedKey));
}否则{
抛出新的IllegalStateException(“预期的KeyTransRecipientInfo”);
}
算法标识符contentEncryptionAlgorithm=envData.getEncryptedContentInfo().getContentEncryptionAlgorithm();
info(“对称加密算法:+contentEncryptionAlgorithm.getAlgorithm().getId());
logger.info(“八位加密数据:”+Hex.toHexString(envData.getEncryptedContentInfo().getEncryptedContent().getOctets());
看起来很痛苦。查看BC PKIX源代码中的org.bouncycastle.cert.cmp.test.AllTests.java
,以获取使用HSM必须修改的内容的提示。