ASN.1中DER和BER的区别

1371人浏览 / 0人评论

一、ASN.1是什么

        在电信和计算机网络领域,ASN.1(Abstract Syntax Notation One) 是一套抽象语法标准,是描述数据的表示、编码、传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。 ASN.1是ISO和ITU-T的联合标准,最初是1984年的CCITT X.409:1984的一部分。由于其广泛应用,1988年ASN.1移到独立标准X.208,1995年进行全面修订后变成X.680系列标准。

ASN.1广泛应用于电信和计算机网络领域,尤其是密码学领域。大量的RFC文档使用ASN.1定义协议、数据格式,比如HTTPS所使用的X.509证书结构等。

ASN.1描述对象的示例: 

FooQuestion ::= SEQUENCE {
    id          INTEGER,
    question    IA5String
}

ASN.1本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。

二、标准的ASN.1编码规则

  • 基本编码规则(BER,Basic Encoding Rules)
  • 规范编码规则(CER,Canonical Encoding Rules)
  • 唯一编码规则(DER,Distinguished Encoding Rules)
  • 压缩编码规则(PER,Packed Encoding Rules)
  • XML编码规则(XER,XML Encoding Rules)

编码规则的作用就是把ASN.1定义的数据对象转换成便于传输的比特流,通过计算机网络进行远程数据传输。

下面是根据第一部分的示例,用几种不同的编码规则进行编码:

#XER(XML Encoding Rules)
<FooQuestion>
    <id>5</id>
    <question>Anybody there?</question>
</FooQuestion>

#BER(Basic Encoding Rules)
30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

#DER(Distinguished Encoding Rules)
30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

三、BER编码规则

        Basic Encoding Rules (BER)是一种自描述的ASN.1数据结构的二进制编码格式。BER编码可以通过一种或多种方式把任意ASN.1值表示成字节字符串(这就增加了一定的不确定性)。每一个编码后的BER数据依次由数据类型标识(Type identifier),长度描述(Length description), 实际数据(actual Value)排列而成,即BER是一种二进制TLV编码。TLV编码的一个好处,是数据的解析者不需要读取完整的数据,仅从一个不完整的数据流就可以开始解析。

四、DER编码规则

        Distinguished Encoding Rules (DER)是BER的子集,主要是消除了BER的一些不确定性的编码规则。DER 用于需要使用唯一的octet string编码的应用程序,例如根据一个ASN.1编码来计算数字签名。

DER在BER规则基础上增加了如下限制:

  1. 如果长度在 0 - 127 之间,必须使用短型长度表示法。
  2. 如果长度大于等于 128,必须使用长型长度表示法,并且长度必须使用尽可能少的字节表示。
  3. 对于简单 string 类型和在其基础上使用隐式标签生成的类型,必须使用简单定长编码方法。
  4. 对于结构化类型和在其基础上使用隐式标签生成的类型及在任何类型基础上使用显式标签生成的类型,必须使用结构化定长编码方法。

五、BER & DER

        如在BER中Boolean类型true的value字节,可以为任何小于255大于0的整数,而在DER中,value字节只能为255。DER的这种确定性,保证了一个ASN.1数据结构,在编码为DER后,只会有一种正确的结果。这使得DER更适合用在数字签名领域,比如X.509中广泛使用了DER。

参考资料

[1] ASN.1

[2] X.680

全部评论