Ben*_*Ben 2 tags encryption encoding cryptography x509
我有一个X.509证书,其中包含一组带有以下IMPLICIT [0]标记的数据:
A0 81 C6 (value)...
Run Code Online (Sandbox Code Playgroud)
我从标准文件中摘录了这些内容:
IMPLICIT [0]标记不用于DER编码,而是使用EXPLICIT SET OF标记.也就是说,必须包含EXPLICIT SET OF标记的DER编码,而不是IMPLICIT [0]标记的DER编码以及值的长度和内容八位字节.
我已经做了很多搜索,但我无法弄清楚标准要求的确切内容.我正在寻找一些澄清.
编辑:这是我遵循的标准: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
Run Code Online (Sandbox Code Playgroud)
我不确定如何解释这个评论.你读什么标准?你有结构的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).