【问题标题】:ASN.1 structure of ECDSA signature in X.509 certificateX.509 证书中 ECDSA 签名的 ASN.1 结构
【发布时间】:2021-02-08 12:39:00
【问题描述】:

使用 ECDSA 签名分析 X.509 证书我发现了一个无法解释的 0x00 字节。

X.509 证书的签名应该在 ASN.1 BIT STRING 结构中给出。
对于 ECDSA,签名由两个整数 (r, s) 组成,编码为两个 ASN.1 INTEGER 的 ASN.1 SEQUENCE。

在我的示例中(使用 openssl 生成)我得到了这个:

    ASN.1 tag for BIT STRING
     |  length 
     |  |    
     |  |     ASN.1 tag for SEQEUNCE
     |  |     |  length
     |  |     |  |
     |  |     |  |  ASN.1 tag for INTEGER             ASN.1 tag for INTEGER           
     |  |     |  |  |  length                         |  length                       
     |  |     |  |  |  |                              |  |                            
     |  |     |  |  |  |   0x21 bytes integer value   |  |   0x21 bytes integer value 
     |  |     |  |  |  |  ____________|____________   |  |  ____________|____________ 
     v  v     v  v  v  v /                         \  v  v /                         \
... 03 49 00 30 46 02 21 00 D5 F4 76 43 ... A2 BD 95 02 21 00 DF 01 30 24 ... 50 12 32
           ^      
           |
           why is there a 0x00 byte?

为什么在 ASN.1 SEQUENCE 标签前多了一个 0x00 字节?

【问题讨论】:

    标签: openssl x509 asn.1 ecdsa


    【解决方案1】:

    ASN.1 的第一个八位字节 BIT_STRINGUnused Bits 指示符。位串并不总是与完整的八位字节(1 个字节)对齐。由于最小编码数据大小为 1 字节,Unused bits 将存储编码值中未使用的位数。例如,您的数据长度正好是 11 位。要编码 11 位长字符串,您将使用 2 个字节,16 位。但是,您必须通过将 Unused Bits 八位字节设置为 5 (16-11) 来指示您的数据长度为 11 位。 Unused Bits 八位字节的可能值为 0-7。更多详情:https://docs.microsoft.com/en-us/windows/win32/seccertenroll/about-bit-string

    【讨论】:

    • 我错过了一个事实,即未使用的位数也在 ASN.1 BIT STRING 结构中编码。我认为这取决于用户实际使用了多少位。因此,如果位串的长度是 8 位的倍数(即整个字节),则第一个字节始终为 0。通常它的值在 0..7 范围内。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2014-09-30
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多