【问题标题】:Can't get bouncycastle to correctly tag constructed octet string in der encoding无法让 bouncycastle 在 der 编码中正确标记构造的八位字节字符串
【发布时间】:2011-08-03 18:16:40
【问题描述】:

我有以下要求。我有一个 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 是否都包含“BerConstructedOctetString”,在编码为 DER 时编码和标记为 0x04?我的两个要求不兼容吗?

【问题讨论】:

  • 你能提供一个参考,说明为什么你认为八位字节字符串应该有标签 0x24 而不是 0x04?

标签: java bouncycastle asn.1


【解决方案1】:

我总是去旧 RSA 实验室的this reference 回答有关 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 进行原始编码。

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多