DER编码 - 如何将隐式标记转换为显式标记

时间:2010-09-03 18:20:27

标签: encryption encoding tags cryptography x509

我有一个X.509证书,其中包含一组带有以下IMPLICIT [0]标记的数据:

A0 81 C6 (value)...

我从标准文件中摘录了这些摘录:

  

不使用IMPLICIT [0]标签   DER编码,而不是EXPLICIT   使用SET OF标签。也就是说,DER   EXPLICIT SET OF标签的编码,   而不是IMPLICIT [0]标签,   必须包括长度   和值的内容八位字节。

我已经做了很多搜索,但我无法弄清楚标准要求的确切内容。我正在寻找一些澄清。

编辑: 以下是我遵循的标准:http://tools.ietf.org/html/rfc3852

我正在尝试验证X.509签名,我需要计算消息摘要才能执行此操作。此证书包含SignerInfo类型中的可选SignedAttributes。我已经对签名内容进行了哈希处理,并验证了SignedAttributes中的消息摘要是否正确。该标准规定,如果存在SignedAttributes,则应对其进行散列和加密以创建证书的签名。该标准还说,SignedAttributes的标签应该按照原始问题中的讨论进行更改。

这是SignerInfo的Asn.1语法:

SignerInfo ::= SEQUENCE {
        version CMSVersion,
        sid SignerIdentifier,
        digestAlgorithm DigestAlgorithmIdentifier,
        signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
        signatureAlgorithm SignatureAlgorithmIdentifier,
        signature SignatureValue,
        unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }

SignerIdentifier ::= CHOICE {
        issuerAndSerialNumber IssuerAndSerialNumber,
        subjectKeyIdentifier [0] SubjectKeyIdentifier }

SignedAttributes ::= SET SIZE (1..MAX) OF Attribute

UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute

Attribute ::= SEQUENCE {
        attrType OBJECT IDENTIFIER,
        attrValues SET OF AttributeValue }

AttributeValue ::= ANY

SignatureValue ::= OCTET STRING

1 个答案:

答案 0 :(得分:7)

我不确定如何解释该评论。你读什么标准?你有结构的ASN.1语法吗?

显式标记就像某个底层类型的包装器。例如,底层类型可能是SEQUENCE。它使用通用SEQUENCE标记0x30进行编码。但是为了避免在封闭结构中如何解释SEQUENCE的模糊性,它被包含在具有特定于上下文的标记的EXPLICIT结构中。从上面的片段中可以看出该标签是什么。

我猜他们的意思是[0] EXPLICIT SET OF foo之类的语法,它(使用原始问题中的示例作为值)将被编码为(hex)A0 81 C9 31 81 C6 (value) ...

请注意,使用特定于上下文的零(A0)标记的原始值已使用通用SET OF(31)重新标记。


好的,在这种情况下,我认为它们的含义是,当您对属性进行签名时,不是使用隐式标记,而是通过SET OF标记计算签名。如果这就是他们的意思,投入“EXPLICIT”真的会让水变得混乱,但无论如何。如果是这种情况,那么编码将只是31 81 C6 (value) ...(用通用的SET OF 0x31替换特定于上下文的0xA0)。