ASN.1学习

ASN.1 全称 Abstract Syntax Natation One. 是一个用来描述抽象类型抽象数据的语法. 类似于 XML, JSON 等, 主要用于编码数据以便于在网络中交换数据. 比如, X509 证书.

Basic Encoding Rules —— BER

1、Primitive, definite-length encoding(基本数据类型,除字符串以外均使用这种编码方式)

+------------+--------+----------+
| identifier | length | contents |
+------------+--------+----------+

对于identifer,有两种格式:
1)low tag number form
2)heigh tag number form

ASN.1学习
对于 length,也有两种格式:
1)short form
2)long from

2、Contructed, definite-length encoding(这种编码方式用于编码复杂类型和简单类型中的字符串类型,其编码长度已知)
编码形式和Primitive, definite-length encoding类似。除了 identifier 字段的第一个字节的 bit6 为1,用来表示复杂类型。

3、Contructed, identifier-length encoding(这种编码方式用于编码复杂类型和简单类型中的字符串类型,且长度未知)
+------------+--------------+----------+----------------------------+
| identifier | length(0x80) | contents | end-of-contents(0x00,0x00) |
+------------+--------------+----------+----------------------------+

1)length 字段的值为0x80,end-of-contents 字段的值为两个字节的0,表示该编码方式为不定长编码。其余字段的编码与 Contructed, definite-length encoding 类似。
   

Distinguished Encoding Rules —— DER
DER 编码在 BER 编码的规则之上添加了如下限制:
1)当编码长度在 0-127 之间时, 必须使用 short form 形式编码 Length 字段
2)当编码长度大于 128 时, 必须使用 long form 形式且应使用最少的字节对长度进行编码,也就是说如果长度为192, 那么 Length 字段只能占两个字节. 第一个字节为0x81, 表示 Length 3字段使用 Long form, 且紧接着只有一个字节用于编码长度信息. 第二个字节为 0xc0, 用来表示长度为 192
3)对于简单字符串类型, 必须使用 primitive, definite-length 进行编码
4)对于复杂类型, 必须使用 constructed definite-length 进行编码