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

原创 2003年02月27日 09:05:00
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,其中,第一个字节是对象标识域,第二个字节是数据长度域,其他为数据域。

ASN1、BER、DER与PKCS

怎样理解和实现PKCS协议族1、ASN1抽象语法规则(osi定义抽象对象的方法)BER基本编码规则(定义了如何把ASN.1类型的值编码为8bit的字节流,通常每个值不止有一种的BER编码方法)DER可...
  • brave1
  • brave1
  • 2005年06月11日 12:51
  • 3011

ASN.1中OID类型的DER编码(附Perl,java源码)

asn1对OID的编码有一些规定,形如a.b.c.d.e的OID被编码的时候,完全可以按照der的编码规则将整个oid的类型设定为object,然后将每一个点分数字的类型设定为integer,最终编码...
  • CaesarZou
  • CaesarZou
  • 2014年06月09日 15:25
  • 2069

DER编码和ASN.1

DER(Distinguished Encoding Rules,可辨别编码规则)。 ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/I...
  • taolinke
  • taolinke
  • 2011年03月03日 13:12
  • 5414

ASN.1中OID类型的DER编码

asn1对OID的编码有一些规定,形如a.b.c.d.e的OID被编码的时候,完全可以按照der的编码规则将整个oid的类型设定为object,然后将每一个点分数字的类型设定为integer,最终编码...
  • CaesarZou
  • CaesarZou
  • 2014年06月09日 15:24
  • 2492

ASN1编解码实现方法

目 录 版本记录 1 目 录 1 第1章 概述 3 1.1 背景 3 1.2 ASN.1概念 3 1.3 TAG 4 第2章 开发工具 4 2.1 开发...
  • wzyzzu
  • wzyzzu
  • 2017年02月09日 14:19
  • 2295

DER编码规则详解

概念: DER是BER的子集,它为每一个ASN.1类型定义一种唯一的编码方案。 DER与BER的区别: DER在BER的基础上增加了如下限制: 长度小于等于127,必须使用短型长度表示...
  • baidu_36649389
  • baidu_36649389
  • 2016年12月09日 14:07
  • 4347

ASN.1, DER, PEM, X509

ASN.1 是一个语言标准,可以与C语言进行类比,ASN.1的主要用途是描述数据结构,而C语言的主要用途则是控制程序走向。使用ASN.1可以描述复杂的数据对象。比如:一块数据中,哪里是长度,...
  • codehat
  • codehat
  • 2017年11月21日 14:26
  • 97

Asn.1协议

ASN
  • chelp
  • chelp
  • 2014年03月30日 16:41
  • 600

SNMP ASN.1 OID编码规则

SNMP ASN.1 OID编码规则 对象标识符(OBJECT IDENTIFIER, OID) 的编码规则 对象标识符类型 对象标识符(OBJECT IDENTIFIER, OI...
  • xiao628945
  • xiao628945
  • 2012年09月21日 22:59
  • 3574

ASN.1编码规范及示例代码

BASE DEFINITIONS IMPLICIT TAGS::=                                 --项目名称不可加-或_之类的字符,全字符。比如C_BASE就不合适...
  • qq_33336155
  • qq_33336155
  • 2017年01月17日 15:31
  • 396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASN.1协议DER编码方法和实例演示
举报原因:
原因补充:

(最多只允许输入30个字)