ASN.1(Abstract Syntax Notation One, 抽象语法符号1)是ITU-T的一个标准集,它用来编码及表示通用数据类型,这些数据类型有可打印串值,八位位组串值,位串值,整数值以及用可移值方式组合而成的其他类型序列值.简单的说,ASN.1指定了以何种方式对非平凡的数据类型进行编码,以便其他任何平台及第三方工具都能够解释其内容.比如,字母a在一些平台以ASCII编码为十进制数值97,而在其他非ASCII平台上,可能会是另外的编码.而ASN.1指定了一种编码方式,在任何平台上,字母a的编码都是统一的.
ASN.1语法. ASN.1语法遵循传统的巴科斯范式BNF风格.最基本的表达式如: Name ::= type . 表示为定义某个名称为Name的元素,它的类型为type. 例如: MyName ::= IA5String . 表示为定义了一个名为MyName的元素或变量,其类型为ASN.1类型IA5String (类似于ASCII字符串). 
类型
类型
含义
CHOICE
在类型中选择(相当于C中的联合)
SEQUENCE
由不同类型的值组成一个有序的结构(相当于C中的结构体)
SET
由不同类型的值组成一个无序的结构
SEQUENCE OF
由相同类型的值组成一个有序的结构(相当于C中的数组)
SET OF
由相同类型的值组成一个无序的结构
BER
简单定长方法
结构化定长方法和非定长方法
DER
DERBER的子集,它定义了使用一个octet string来表示任何ASN.1值的编码方法。DER用于需要使用唯一的octet string编码的应用程序,例如根据一个ASN.1编码来计算数字签名。DERX.509的第8.7节定义。
DER在第3节给出的规则基础上增加了如下限制:
1. 如果长度在0127之间,必须使用短型长度表示法。
2. 如果长度大于等于字符串长度必须大于0128,必须使用长型长度表示法。并且长度必须使用尽可能少的字节表示。
3. 对于简单string类型和在其基础上使用隐式标签生成的类型,必须使用简单定长编码方法。
4. 对于结构化类型和在其基础上使用隐式标签生成的类型、及在任何类型基础上使用显式标签生成的类型,必须使用结构化定长编码方法。
对于特殊类型(如BIT STRINGSEQUENCESETSET OF)的其他限制见第5节。
某些类型的符号和编码
PER(Packed Encoding Rules)
BER编码规则,每个传输的数据值,不管简单类型还是复合类型,都是TLV三个字段构成,最小的数据单元是OCTETS的8位数据。
而PER是尽可能简单的规则得到最简洁的编码,一个bool类型编码在PER中可以仅占一个bit。但PER使用的一个重要前提就是网络通信的收发双方都清楚正在使用的ASN.1句法描述的数据结构,这需要双方都遵循统一的通信协议。
PER编码中没有Tag域,因此PER不再缺省支持扩展,必须明确在描述中添加扩展符。
只有当长度没有被SIZE固定或者数据长度很重要的情况下,才对Length进行编码;
SEQUENCE或者SET类型的值编码时,汇总前面增加个bitmap来标识可选成员是否出现;
PER编码规则可以分为基本的(Basic)和规范的(Canonical)两类,每一类又可以分为对齐(Aligned)和不对齐(Unaligned)两种。规范形式的优势在CERDER中已经讨论过了,主要用在中继接力系统和安全系统等使用数字签名的场合。在基本形式中,一个抽象值可能有多个PER编码。但是,在有限测试后,我们知道基本形式编码器要比规范形式编码器速度更快。
对齐方式下,为了保持八位组对齐,可以增加值为0的比特。不对齐方式则编码更为紧凑,但是在编解码时需要花费更多的处理时间。不对齐方式下,不会检查八位组的对齐情况,只在整个数据编码结束后,才进行补位。
注意对齐和不对齐两种方式不能互通,即只能用同种的解码器解码同种编码器编码后的码流。
在四种变形中,基本不对齐方式编码是最紧凑的。按照紧凑性降低的顺序,后续依次为:规范不对齐方式,基本对齐方式和规范对齐方式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。