java - 从 Bouncy CaSTLe 的 CMSAuthenticatedData [Java] 检索封装内容

标签 java bouncycastle

我正在使用 Bouncy CaSTLe 库版本 146 中的 CMSAuthenticatedData。我可以正确创建它,通过检查 ASN.1 转储进行验证,但我似乎无法检索内容。

经过身份验证的数据对象是使用生成器创建的,如下所示:

CMSAuthenticatedDataGenerator generator = new CMSAuthenticatedDataGenerator();
CMSProcessableByteArray myContent = new CMSProcessableByteArray(myBytes);
CMSAuthenticatedData cmsData = generator.generate(myContent, myMacCalculator);
然后使用 .getEncoded() 对 cmsData 进行序列化,发送到服务器,并使用 byte[] 构造函数进行反序列化。来自 RFC ,我看到 myBytes 应该位于 AuthenticatedData 对象内的 encapContentInfo 字段中,但我无法获取它。这是我到目前为止所尝试过的:

// The original byte array I want to retrieve is 633 bytes long.

cmsData.getEncoded();
// returns ASN.1 for authData OID and AuthenticatedData object. Size: 724

cmsData.getContentInfo();
// Same as cmsData.getEncoded(). Size: 724

cmsData.getContentInfo().getContent().getDERObject().getEncoded();
// returns ASN.1 for AuthenticatedData object. Size: 703

那么,这是否可能,或者我应该推出自己的实现,解析 ASN.1 字节数组?

最佳答案

经过几周的研究,我找到了一个使用 org.bouncycastle.asn1.cms.AuthenticatedData 的解决方案:

CMSAuthenticatedData cmsData; // <- this is the object created.
byte[] cmsBytes = cmsData.getContentInfo().getContent().getDERObject().getEncoded();
ASN1Sequence byteSeq = (ASN1Sequence) ASN1Object.fromByteArray(rawAuthenticatedDataBytes)
AuthenticatedData authData = new AuthenticatedData(byteSeq);
byte[] contentBytes = authData.getEncapsulatedContentInfo().getContent().getDERObject().getEncoded()

我当然希望这不是最简单的方法,但这是我找到的唯一方法。

关于java - 从 Bouncy CaSTLe 的 CMSAuthenticatedData [Java] 检索封装内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9590983/

相关文章:

java - Jetty Tapestry 热部署=服务器重启?

encryption - 充气城堡没有这样的方法错误

java - 如何将证书信息与已签名的数据关联?

java - 使用另一个线程终止一个线程(循环)

java - 如何为 jBPM 中的流程定义部署生成 sql 脚本?

java - 3D 外观 2D 绘图的适当转换 (Java)

java - @Value注释不返回值

java - OpenSSL 始终无法验证 Java 中 Bouncy CaSTLe 生成的签名

java - 解析 ASN1 数据

azure - Azure Web 应用程序中 BouncyCaSTLe 的 DecryptKey 方法失败