-
- 了解ASN.1编码
ASN是Abstract Syntax Notation的缩写,ASN.1(抽象语法标记版本1)是一种能自解析的数据的编码格式,只要是标准的ASN.1格式的文件都可以把其中的数据解析出来(用二进制表示),如果,再结合数据的各个字段的编码方法,就可以把其内容解析为可读信息。
能自解析是因为它使用的一种TLV的数据表示方法。TLV是3个单词的首字母:Tag、Length、Value,即标识符、长度、值。
- T:标识符,在整个数据文件的标识符命名空间中唯一,它可以是整个文件的标识,也可以是记录的标识,也可以是字段的标识。
- L:长度,即这种标识符表示的数据内容有多少个字节。这里的长度指的是字节数,这个字节数不包括tag和length本身的字节数。
- V:即这种标识符的数据内容,其长度就是L表示的字节数。
从整个数据文件的第一个字节开始,就是用这种TLV方法来表示的,因此,我们从一个TLV就可以知道整个文件的长度(字节数),也可以知道某条记录的长度,某个字段的长度和内容等等。
我们可以借用一些工具来查看ASN.1文件的内容,便于核对我们的配置是否正确,这里使用:windows下面的Asn1Viewer 1.2.exe工具来说明。
-
-
-
- Tag的编码
-
-
下图就是截取的一些TLV组,对这些TLV组中的tag进行解释说明:
Tag可以是一个单字节的标识,也可以是一个多字节的标识,它们的编码规则是这样的:
- 如果tag的第一个字节的后5位不是0x1F,则这个tag就只有一个字节,就是它本身,如下图中的tag只有一个字节的情况中,tag就是0x50
- 如果tag的第一个字节的后5位是0x1F,并且下一个字节的最高位不是1,则,这个tag有2个字节,就是第一个字节和其后的那个字节,如下图的tag有2个字节的情况在,tag就是0x5F69。
- 如果tag的第一个字节的后5位是0x1F,并且下一个字节的最高位是1,则这个tag有多个字节,就是第一个字节之后,所有的最高位是1的那些字节,再加上最后一个最高位是1的那个字节之后的一个字节。如下图中的tag多于2个字节的情况之,tag就是0x5F811F。
-
-
-
- Length的编码
-
-
用下图来说明长度的编码方法:
- 如果长度的第一个字节的最高位不是1,则长度只有一个字节,就是它本身。如下图的长度只有一个字节的情况之,长度是0x01。
- 如果长度的第一个字节的最高位是1,则长度有多个字节组成,字节的总数等于这个字节去掉最高位之后,剩余的7位所表示的数值的大小。如下图中的长度是多字节的情况中,长度是:0x82 01 35。这里长度的第一个字节是0x82,表明这个长度有多个字节组成,字节的总数等于0x02(去掉最高位1之后)表示的数值的大小,等于2,所以是2个字节,即长度是其后的2个字节:0x0135,等于十进制的309个字节。