首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASN.1在openSSL中封装BITSTRING类型

ASN.1在openSSL中封装BITSTRING类型
EN

Security用户
提问于 2017-06-14 16:12:18
回答 3查看 2.8K关注 0票数 5

我目前正在构建一个ASN.1解析器,该解析器应该以ASN.1 DER格式解码X.509v3证书和时代文件。解析器工作得很好,除了一个我似乎无法理解的问题。如果我解码DER格式,我会发现对于公钥,使用了以下形式的BITSTRING:

代码语言:javascript
复制
 BIT STRING, **encapsulates** {

 SEQUENCE {

 INTEGER

     // public key hex string

但是,当我查看签名时,我发现它是用没有encapsulates标记的BITSTRING表示的,并且只包含签名的十六进制缓冲区:

代码语言:javascript
复制
 SEQUENCE {

 OBJECT IDENTIFIER sha256WithRSAEncryption (1 2 840 113549 1 1 11)   

 NULL

 } 

 BIT STRING 

 // RAW signature hex buffer }

对于我的解析器来说,了解BITSTRING是否只包含一个缓冲区(例如,在签名的情况下)还是封装其他类型(例如在公钥情况下)是很重要的。在这两者的编码中,我没有发现任何可能意味着使用封装的不同之处。

我的问题是:如何区分解析器代码中的这两个场景?

EN

回答 3

Security用户

回答已采纳

发布于 2017-06-14 17:55:27

如果不知道您解析的是什么类型的数据,您就不可能知道这一点。

如果您知道您正在解码的数据类型,那么您应该使用ASN模块和相关文档来调整解析器。此外,你可能需要做一些智力工作。

BITSTRING将只包含一个缓冲区(如签名的情况)。

它不是原始缓冲区,也可能是嵌套类型。例如,如果您查看ECDSA签名,您会发现编码签名是嵌套的复杂类型:

代码语言:javascript
复制
ECDSA-Sig-Value ::= SEQUENCE {
    r  INTEGER,
    s  INTEGER
   }

下面是它的样子:

或封装其他类型(如在公钥情况下)

再说一遍,也不总是。RSA密钥在BIT_STRING中使用嵌套结构,EC密钥不使用:

这些只是你的假设失败的例子。签名可能有嵌套结构,公钥可能没有。它取决于上下文,如果没有文档,就很难知道预期会发生什么。所以我建议使用这些文件。例如,包含大多数PKIX ASN模块的RFC5912

如果您不知道解析的是哪些数据,那么您必须做一项艰苦的工作,以主动检查当前类型是原始类型还是构造类型(没有设置CONSTRUCTED位)。如果可能的话,即尝试展开嵌套类型。

我有一个通用的原始解析器,用于将ASN二进制数据解码为用C#:Asn1DerParser.NET和解析器类:Asn1Reader编写的离散结构。

票数 4
EN

Security用户

发布于 2017-06-14 19:26:00

BIT STRING是一种基本类型,它表示“值是位序列”,绝对没有关于如何解释这些位的额外信息。在编码方面没有区别,取决于值位本身是否应该是某种嵌套结构的更好的编码,还是“只是位”。

“正常”答案是@Crypt32 32给出的答案:当您解码一个结构(例如X.509证书)时,您应该知道您正在解码的是哪种结构,并采取相应的行动。这在实践中可能非常复杂;例如,SubjectPublicKeyInfo结构包含标识公钥类型的AlgorithmIdentifier和包含公钥值的BIT STRING。如果公钥是RSA密钥,那么BIT STRING的值应该是一个DER编码结构(两个INTEGER值的SEQUENCE );但是,如果这是一个EC公钥,那么BIT STRING的包含将是原始编码的公共点,没有ASN.1或DER。

如果您的工具是用于诊断,那么您可以使用启发式。您可能想看看DDer,它是一个通用的ASN.1/DER解析器(实际上,它支持BER)。当遇到“二进制值”(BIT STRINGOCTET STRING)时,它试图查看该值本身是否可以解码为ASN.1对象。由于BER/DER编码是相当冗余的,因此很少有像签名这样的任意随机值匹配DER编码而没有错误(基本上是10000次左右的1次)。

(DDer还附带了一个名为MDer的配套工具,它执行反向操作:从基于文本的表示到DER编码。这可以方便地制作测试对象。)

票数 3
EN

Security用户

发布于 2017-06-15 13:43:19

位字符串和八位字符串都可以包含数据或嵌入式ASN.1。虽然它有助于了解在解析之前应该采用什么格式,但并不完全必要。(那些ASN.1解码器在完全解析之前不知道自己在解码什么。)解析一个八进制字符串时,您只需查看内容,就可以看到它符合ASN.1原语的格式(1字节头,后面跟着大小信息,后面跟着大小所指示的数据量)。

位字符串的剖析要复杂一些。位字符串有一个字节,它表示偏移位数--位字符串以字节为单位保存,但存储在对象中的实际位数可能在8倍的1到7之间。只有当偏移量为0时,才能查看包含的字节并计算包含的数据是否是ASN.1原语。

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/161982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档