Openssl ASN.1 X.509证书中ECDSA签名的结构

Openssl ASN.1 X.509证书中ECDSA签名的结构,openssl,x509,asn.1,ecdsa,Openssl,X509,Asn.1,Ecdsa,分析带有ECDSA签名的X.509证书时,我发现一个0x00字节,无法解释 X.509证书的签名应采用ASN.1位字符串结构。 对于ECDSA,签名由编码为ASN.1的两个ASN.1整数序列的两个整数(r,s)组成 在我的示例(使用openssl生成)中,我得到了以下结果: ASN.1 tag for BIT STRING | length | | | | ASN.1 tag for SEQEUNCE | | |

分析带有ECDSA签名的X.509证书时,我发现一个0x00字节,无法解释

X.509证书的签名应采用ASN.1位字符串结构。
对于ECDSA,签名由编码为ASN.1的两个ASN.1整数序列的两个整数(r,s)组成

在我的示例(使用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序列标记之前有一个额外的0x00字节?

ASN.1
位字符串的第一个八位字节是
未使用的位
指示器。位字符串并不总是与完整的八位字节(1字节)对齐。由于最小编码数据大小为1字节,
未使用的位
将存储编码值中未使用的位数。例如,您的数据长度正好是11位。要编码11位长的字符串,您将使用2个字节,16位。但是,您必须通过将
未使用位
八位字节设置为5(16-11)来指示数据长度为11位。
未使用位的可能值为0-7。更多详细信息:

ASN.1的第一个八位字节
位字符串
未使用位的指示器。位字符串并不总是与完整的八位字节(1字节)对齐。由于最小编码数据大小为1字节,
未使用的位
将存储编码值中未使用的位数。例如,您的数据长度正好是11位。要编码11位长的字符串,您将使用2个字节,16位。但是,您必须通过将
未使用位
八位字节设置为5(16-11)来指示数据长度为11位。
未使用位的可能值为0-7。更多详细信息:

我忽略了一个事实,即未使用位的数量也在ASN.1位字符串结构中编码。我认为实际使用了多少位取决于用户。因此,如果位字符串的长度是8位(即整个字节)的倍数,则第一个字节始终为0。一般来说,它的值在0..7的范围内。非常感谢。没错。我忽略了一个事实,即未使用位的数量也是在ASN.1位字符串结构中编码的。我认为实际使用了多少位取决于用户。因此,如果位字符串的长度是8位(即整个字节)的倍数,则第一个字节始终为0。一般来说,它的值在0..7的范围内。非常感谢。没错。