1

我有以下要求。我有一个 asn1 类型,需要封装在构造的八位字节字符串中(八位字节字符串标记为 0x24)。然后在 CMS 签名块中对该结构进行签名,并且整个 CMS 块需要进行 DER 编码。

我的问题是每次我对 CMS 块进行 DER 编码时,构造的八位字节字符串都会变成(非构造的?)八位字节字符串。我的意思是它的标签从 0x24(我需要的)切换到 0x04。

这是一个 Bouncycastle 错误还是我在做我不应该做的事情?忽略 CMS 块,似乎每当我尝试对“BerConstructedOctetString”进行 der 编码时,它不再是构造的八位字节串:

BERConstructedOctetString constructed = new BERConstructedOctetString(new DERInteger(3));
ASN1Object nonConstructed= new DEROctetString(new DERInteger(3));

System.out.println(Util.toHex(constructed.getDEREncoded()));
System.out.println(Util.toHex(nonConstructed.getDEREncoded()));
System.out.println(Util.toHex(constructed.getEncoded()));
System.out.println(Util.toHex(nonConstructed.getEncoded()));

使用以下输出:

04:03:02:01:03
04:03:02:01:03
24:80:04:03:02:01:03:00:00
04:03:02:01:03

编辑:这甚至可能吗?bouncycastle 和 not-yet-commons-ssl 是否有理由在编码为 DER 时包含“ Ber ConstructedOctetString”并标记为 0x04?我的两个要求不兼容吗?

4

1 回答 1

1

我总是从旧的 RSA 实验室参考这个参考资料来回答有关 BER/DER 编码的问题。在这种情况下,请查看第 4 节(DER 编码规则)中的规则 #3:

3. For simple string types and implicitly tagged types derived from
simple string types, the primitive, definite-length method must be
employed.

如果我没看错的话,如果您要求 DER 编码,这会强制使用 0x04 进行原始编码。

于 2011-08-03T22:01:20.437 回答