ASN.1协议DER编码方法和实例演示

本文介绍了ASN.1编码方法的四个关键组成部分:对象标识域、数据长度域、数据域和结束标志(可选)。详细解释了低Tag数字和高Tag数字的形式,以及短形式和长形式的数据长度域。并通过一个具体的DER编码实例,展示了如何对BITSTRING类型对象进行编码。

openssl之ASN.1系列之2---ASN.1编码方法简介
   ---根据openssl源代码、SSLeay Documents以及其它相关材料写成
   作者:DragonKing(Eric Wang)
   Mail: wzhah@263.net
   版权声明:未经作者授权,本文不能在任何商业性质的出版物或网站上进行转载
   发布网站:http://openssl.126.com
   OpenSSL版本:openssl-0.9.7
   参考资料:“Computer Network”,“A Layman's Guide to a Subset of ASN.1, BER, and DER”
   
   
   ASN.1对象的编码是ASN.1标准的重要部分,目前,通常采用的是BER,而DER则是其一个子集。本文将对该编码方法作简单的介绍。
   一个标准的ASN.1编码对象有四个域:对象标识域、数据长度域、数据域以及结束标志(可选,在长度不可知情况下需要,openssl中没有该标志)。
   【对象标识域】
   对象标识域有两种形式,低Tag数字(Tag值在0到30)和高Tag数字(Tag值大于30)形式。
   低Tag数字形式只有一个字节,包含三部分,从低位为1开始编号,8和7位是Tag类型,共有四种,分别是universal(0 0)、application(0 1)、context-specific(1 0)和private(1 1);第6位是0,表明编码类型是基本类型,第5-1位是Tag值。 
   高Tag数字形式可以有两个或多个字节,第一个字节跟低Tag数字形式一样,但低5位值全为1,而在后续的第二个和其后的字节中给出Tag值,这些字节都只使用了低7位为数据位,最高位都设为0,但最后一个字节的最高位设为1,采用高位优先,经可能少的数字原则。
   【数据长度域】
   数据长度域也有两种形式,短形式和长形式。
   短形式的数据长度域只有一个字节,第8位为0,其它低7位给出数据长度。
   长形式的数据长度域有2到127个字节。第一个字节的第8位为1,其它低7位给出后面该域使用的字节的数量,从该域第二个字节开始给出数据的长度,基于256,高位优先。
   【数据域】
   数据域给出了具体的数据值。该域的编码对不同的数据类型不一样,这里就不在一一详述了,有兴趣的可以参看参考资料。
   【一个编码例子】
   下面是SSLDocument给出的对一个对象进行DER编码的例子,更多的例子可以参看本文给出的参考资料。
   例子使用的对象是ASN.1定义的BIT STRING类型的对象,其编码的步骤如下:
   1.对位串使用"0"进行填补,使其长度为8的整数倍(如果已经是整数倍,则不需要进行填补);
   2.计算填补的位数并写下来,成为数据内容的第一个字节;
   3.写入填补后的位串,高位字节优先。这些数据跟前面的一个字节组成数据内容的全部字节;
   4.在这些数据前面加上一个头字节,这个字节定义如下(编号是从低位为1开始):
   第8、7位:00(universal类型)
   第 6 位 :0(表明是基本类型,有限长度的编码)
   第5-1位:0x03(表明是BIT STRING)
   这个字节定义了对象标识域;
   5.然后在对象标识域字节和数据字节之间加入下面计算的定义的字节:
   计算有多少字节的数据内容(对象标识域数据除外),如果少于127字节,那么就定义一个字节如下:
   第8位:0
   第7-1位:数据内容的字节数量
   如果数据内容的字节数量大于127,就需要定义两个或多个字节,其中,第一个字节的定义如下:
   第8位:1
   第7-1位:该域后面还有多少字节
   其后的字节是数据内容的字节数量,每字节基于256,高位优先
   下面是一个实际的数据例子:
   位串:'01000100111011'
   1.补齐两个0在后面,成为8的整数倍,得到'0100010011101100';
   2.'02'作为第一个数据内容的字节;
   3.'44 ec'作为其余的数据内容的字节;
   4.'03'作为前面的对象标识字节;
   5.因为BIT STRING的tag值3<=127,所以只有一个字节的长度域'03';
   那么得到的这个位串的DER编码就是03 03 02 44 ec,其中,第一个字节是对象标识域,第二个字节是数据长度域,其他为数据域

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值