Openssl ASN.1 X.509证书中ECDSA签名的结构
分析带有ECDSA签名的X.509证书时,我发现一个0x00字节,无法解释 X.509证书的签名应采用ASN.1位字符串结构。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,签名由编码为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的范围内。非常感谢。没错。