我有以下要求。我有一个asn1类型,需要封装在一个构造的八位字符串中(八位字节字符串标记为0x24)。然后在CMS签名块中对此结构进行签名,整个CMS块需要进行DER编码。
我的问题是每当我对CMS块进行DER编码时,构造的八位字节串就变成一个(非构造的?)八位字节串。我的意思是它的标签从0x24(我需要的)切换到0x04。
这是一个Bouncycastle错误还是我在做一些我不应该做的事情?忽略CMS块,似乎无论何时我尝试对'BerConstructedOctetString'进行编码,它都不再是构造的八位字符串:
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包含' Ber ConstructedOctetString'编码并标记为0x04时编码为DER?我的两个要求是不相容的吗?
答案 0 :(得分:1)
我总是从旧的RSA实验室转到this reference来回答有关BER / DER编码的问题。在这种情况下,请查看第4节中的规则#3(DER编码规则):
3. For simple string types and implicitly tagged types derived from
simple string types, the primitive, definite-length method must be
employed.
如果我正确读取,如果你要求DER编码,这会强制原始编码为0x04。