【问题标题】:DER encoding - How to convert implicit tag to explicit tagDER 编码 - 如何将隐式标记转换为显式标记
【发布时间】:2011-04-07 23:58:52
【问题描述】:

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

A0 81 C6 (value)...

我有一个标准文档的摘录:

IMPLICIT [0] 标签不用于 DER 编码,而不是 EXPLICIT 使用了 SET OF 标签。也就是说,DER EXPLICIT SET OF 标签的编码, 而不是隐式 [0] 标记, 必须与长度一起包含 和值的内容字节。

我已经进行了很多搜索,但我无法确切了解该标准的要求。我正在寻找一些澄清。

编辑: 这是我遵循的标准:https://www.rfc-editor.org/rfc/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

【问题讨论】:

  • 是否在特定的扩展中?
  • SignerInfo 的 SignedAttributes 字段。这是我遵循的标准 - tools.ietf.org/html/rfc3852#section-5.4 所以我正在尝试验证此 X.509 证书上的签名,我需要获取从证书签名的数据。此证书包括可选的 SignedAttributes 字段,并且根据标准,整个字段(标签、长度和值)经过散列和加密以创建签名。但是当我尝试用这个值验证签名时,它失败了。我想我需要以某种方式更改标签。

标签: encryption encoding tags cryptography x509


【解决方案1】:

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

显式标记就像是一些底层类型的包装器。例如,基础类型可能是 SEQUENCE。它使用通用 SEQUENCE 标签 0x30 进行编码。但是为了避免在封闭结构中如何解释 SEQUENCE 时产生歧义,它被包装在带有特定于上下文的标记的 EXPLICIT 结构中。从上面的sn-p看不清楚那个标签是什么。

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

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


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

【讨论】:

  • 编辑回答您的一些问题。我会试试你的建议,谢谢。
  • @Ben - 查看我的更新。我想我的第一个猜测是离谱。
  • 将 A0 更改为 31 是我的第一个想法。我试过了,但无法通过验证。我认为将 A0 更改为 31 是正确的,因为它具有逻辑意义,所以我可能会遇到不同的问题。
  • 解决了一堆其他问题,发现A0到31是正确的。
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多