ASN.1规则中Boolean和bitstring编码方式的简介

来源:互联网 发布:手机壁纸网站 知乎 编辑:程序博客网 时间:2024/06/06 08:57
        在国际标准ITU-T X.690 《Information technology – ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)》中定义了ASN.1编码规则。对于一般数据类型(比如Integer、octetstring、bitstring等),ASN.1编码的一般形式如下图所示:

         对于Boolean类型,标志位取值为1,DER编码规则使用0xFF表示Ture,BER编码规则可使用任意非0值表示True,它们都使用0表示False,不管取值是True还是False,值的长度都是1个字节。于是True的DER编码如下图:

        False的编码如下图:

        接下来介绍bistring类型的编码方法:bistring类型的标志位取值为3。不包含任何比特的比特串被称为“空比特串”(empty bitstring)。其他比特串,例如对于“10101”这个比特串,其长度(即比特个数)为5,在这里将其表示为:{1,0,1,0,1}。考虑到比特串的长度不一定刚好是8的整数倍,而计算机中的最小存储单位是“字节”,一个字节包含8个比特,为了便于在计算机中表示比特串,对bitstring类型做ASN.1编码时,要做一些补位等额外的操作,按照以下步骤进行:
1) 补位;当比特串的长度不是8的整数倍时,要先对比特串进行补位。方法是在比特串的末尾添加比特 0,直到整个比特串的长度刚好是8的整数倍时停止。
2) 添加补位长度字节;将补位时添加的比特个数用一个字节表示,添加到补位结果比特串的前面。如果比特串的长度恰好是8的整数倍,此时未补位,那么此时必须在原始比特串前面添加一个0x0字节,以表示添加的补位比特个数为0。由此可知,补位长度这一个字节的取值范围为0到7。在进行过补位情况下(即原始比特串长度不是8的整数倍),补位长度字节和补位结果比特串共同组成了ASN.1  bitstring编码的负载部分;在未补位情况下(即原始比特串长度是8的整数倍),补位长度字节0和原始比特串共同组成了ASN.1  bitstring编码的负载部分。
3)编码。按照标志位、负载长度、负载的次序,进行编码。
对于比特串{1,0,1,0,1},编码过程如下图:


        对于空串(empty bitstring),其编码为:0x3  0x0
注意空串编码中仅包含标志位和负载长度,不包含负载部分。

        如果一个比特串中不包含比特1,例如 {0},该比特串仅包含一个比特0,其DER编码为:0x3  0x1  0x0
(实际上一个完全由比特0组成的比特串并无实际意义,一般用一个比特 {0} 来统一表示这一类的比特串)
        DER编码规则要求输入编码器的原始比特串的最后一个比特必须是1,即类似 {1, 0, 1, 0, 0} 这种以比特0作为结尾比特的比特串不是符合要求的编码器输入。而BER编码规则不要求输入编码器的原始比特串的最后一个比特必须为1,在编码前,甚至可以在一个比特串的末尾再添加任意个比特0。例如:在应用BER编码规则时,{1. 0, 1} 可以编码为以下不同的形式:
0x3  0x2  0x5  0xA0
0x3  0x3  0x5  0xA0  0x0
0x3  0x4  0x5  0xA0  0x0  0x0
0x3  0x5  0x5  0xA0  0x0  0x0  0x0
.......

        使用BER编码规则时,对同一个对象编码,其编码结果可以是不唯一的。而使用DER编码规则时,对同一对象编码,其编码结果一定是唯一的。在实际应用中,大多数情况下都使用DER编码。

原创粉丝点击