asn.1和基本编码规则
- 格式:pdf
- 大小:242.22 KB
- 文档页数:16


ASN1简单介绍
ASN.1 in Action
LJ 2006-06-27
内容提要?ASN.1背景
ASN.1基本概念和语法
ASN.1编码介绍
ASN.1示例
ASN.1 = Abstract Syntax Notation One ?目标:
传送语法
互联网上数据传输时的表现形式,通常用8位位组的流表示?中立
作为标准的计算机对象描述规则,平台无关,实现无关?抽象
以字节为基础单位,能够描述各种复杂的对象结构
Syntax
ASN.1 --Abstract Syntax Notation One
Rules
BER --ASN.1 Basic Encoding Rules
DER --ASN.1 Distinguished Encoding Rules
BER(ASN.1 Basic Encoding Rules)
定义了一种或几种方法,使用ASN.1语法将数据对象转换成二进制字节码
DER(ASN.1 Distinguished Encoding Rules)?BER的子集,定义了唯一一种方法,使用ASN.1语法将数据对象转换成二进制字节码
BER DER
特点
标准性
高效性
扩展性
比其他任何一种语言更为丰富的数据结构
基本类型 简单类型“原子”的,无分量
结构类型有分量
标记类型从其他类型衍生而来
其他类型CHOICE, ANY
赋值操作符::=
::=用来对类型和值命名,并可用这些名字定义其他类型和值
基本描述语法
DigestInfo ::= SEQUENCE {
digestAlgorithm DigestAlgorithm,
digest Digest }
DigestAlgorithm ::= AlgorithmIdentifier
Digest ::= OCTET STRING
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
ASN.1解析说明
前面已经介绍过ASN.1的基本格式及编码结构了,这次主要针对ASN.1的解码,详细分析一下。
BER传输语法的传统格式是TLV三元组格式,见表1。
图1 TLV三元组
TLV每个域都是一系列八位组,对于组合结构,其中V还可以是TLV三元组,见图2。
图2 传输语法示例
BER传输语法是基于八位组的,自定界的编码,因为其中L明确界定了八位组的长度。BER是大端编码的,其八位组的高位比特在左手边,见图3。
图3 大端编码
Tag解码
Tag即标签,BER编码中的Tag(通常是一个八位组),指明了值的类型。见下图。除了CHOICE和ANY类型以外,每种ASN.1类型都有一个Tag标签值。Tag标签值可以唯一区分ASN.1类型。Bit7和bit6表示类型;bit5值为0,表示编码方法为简单化的,bit5值为1表示结构化的;Bit4-0给出了具体的标签值。
比特表征(bit 5)指明是基本类型还是结构化类型(Primitive/Constructed),当基本类型时,后面的V就是V;当结构化类型时,后面的一个V由新的TLV三元组组成。
后5位不全为1时,则后5位就表示tag值;后5位全为1时,直到后面八位组的最高位为0,则tag才结束,此时将下图黄色部分拼接后才是Tag的值。
Length解码
长度表示后面Value部分所占八位组的个数,分为2类,定长和不定长。定长分为短、长两种形式,最高位为0的是短形式,低7位表示长度;最高位为1的是长形式,低7位表示的是长度字段包含的字节数。不定长,长度字段固定为0x80,在V字段结束后以两个0x00结尾。
注:解该字段时,优先判断是否为不定长,然后在判断是短形式还是长形式。
ASN.1解码结构体:
typedef struct {
unsigned char ucASN1TAG_CLASS; // TAG类型
unsigned char ucASN1TAG_PC; // 基本类型or结构化类型
asn.1的ber编码
ASN.1即抽象语法符号,用来定义应用程序数据和表示[wiki]协议[/wiki]数据单元的抽象语
言。
优点是独立于机器、语言及应用程序的内部表示。适用于描述现代通信中复杂的、变化的、
可扩展的数据结构。比如[wiki]3G[/wiki]和Vo[wiki]IP[/wiki]均采用了 ASN.1。
ASN.1分两大部分:语法规则和编码规则。
语法规则 1. ASN.1定义示例
Age ::= INTEGER (0..120)
User ::= SEQUENCE { name IA5String (SIZE(1..128)),
ageAge DEFAULT 18,
address IA5String OPTIONAL,
...
} 2. 简单类型
基本类型
字符串类型
对象类型
其它类型 3. 构造类型
SEQUENCE,对应于C语言中的struct
SEQUENCE OF,对应于数组
SET,类似于SEQUENCE,但不考虑分量顺序
SET OF,集合类型,每一分量类型相同,不考虑顺序 4. 类型定义
语法:typereference ::= Type
示例:
1) Counter ::= INTEGER
2) UserAccount ::= SEQUENCE { usernamePrintableString,
passwordPrintableString,
account INTEGER
} 5. 赋值 语法:valuereference Type ::= Value
示例:
1) current Counter ::= 1234
2) myAccountUserAccount ::= {
username “tly”, password “guesswhat”, account 2345
} 编码规则 1. BER 1) 三种情况及其格式:
a.简单类型(Primitive),定长;
ASN.1 BER编码Context字段规则
1. 介绍ASN.1
ASN.1(Abstract Syntax Notation One,抽象语法表示一)是一种用于定义数据结构和编码规则的标准。它被广泛应用于电信领域中的通信协议中,如LDAP、X.509证书、SNMP等。ASN.1定义了一种独立于语言的数据表示方式,使得不同的计算机系统可以相互理解和交换数据。
2. ASN.1 BER编码
ASN.1 BER(Basic Encoding Rules,基本编码规则)是ASN.1中定义的一种编码规则,用于将数据结构转换为二进制编码形式以便在网络之间进行传输。ASN.1 BER编码采用的是长度与值分开的方式来表示数据,具有自描述性和无需额外分隔符的特点,使得编码后的数据更为紧凑和高效。
3. Context字段规则
在ASN.1 BER编码中,Context字段用于标识数据结构中的某个字段,以及与该字段相关联的数据内容。Context字段由一个标签和一个值组成,用于在解析数据时识别字段的含义和位置。
4. Context字段的编码方式
在ASN.1 BER编码中,Context字段的编码方式遵循特定的规则,包括以下几点:
a. 标签编码:Context字段的标签由一个或多个字节组成,用于唯一标识数据结构中的某个字段。标签的编码规则采用了可变长的方式,以保证对于不同范围的标签能够被正确编码。
b. 值编码:Context字段的值部分采用了对应数据类型的编码规则,如INTEGER、BOOLEAN、SEQUENCE等。值部分的编码方式与普通字段的编码方式一致,但在解析时需要根据Context字段的标签来确定字段的含义。
c. 长度编码:Context字段的长度部分采用了可变长度编码方式,以使得不同范围的长度能够被正确编码。
5. Context字段的应用场景
在实际应用中,Context字段常常被用于表示数据结构中的一些辅助性信息,如选项值、状态信息、错误码等。它可以使得数据结构更加灵活和可扩展,同时也能够提高通信协议的可读性和可靠性。