简介

之前咱们讲到了优良的数据描述语言ASN.1,很多协定规范都是应用ASN.1来进行形容的。对于ASN.1来说,只定义了数据的形容是不够的,它还规定了音讯是如何被编码的,从而能够在不同的机器中进行通信。

ASN.1反对一系列的编码规定,比方BER,DER,CER等。而X.690就是一个ITU-T的规范,它外面蕴含了一些对ASN.1进行编码的规定。

有人要问了,那么什么是ITU-T呢?

ITU-T的全称是International Telecommunication Union Telecommunication Standardization Sector,也就是国际电联电信标准化部门,次要用来协调电信和信息通信技术标准。

X.690次要蕴含了Basic Encoding Rules (BER),Canonical Encoding Rules (CER)和Distinguished Encoding Rules (DER)这三种编码规定。

接下来,咱们来看下这些编码规定的实现细节。

BER编码

BER的全称是Basic Encoding Rules,它是最早的编码规定,应用Tag-Length-Value(TLV)的格局对所有信息进行编码。

在BER中,每个数据元素都被编码为类型标识符、长度形容、理论数据元素,以及可选的内容完结标记,如下所示:

类型标识符长度理论数据内容完结标记
TypeLengthValue只用在不确定长度的状况

所有的编码都是以字节为单位的。

类型标识符

ASN.1的类型有上面几种,下表列出了ASN.1中类型和对应的十进制的关系:

type名称根底类型还是组合类型Number(十进制)
End-of-Content (EOC)根底类型0
BOOLEAN根底类型1
INTEGER根底类型2
BIT STRING两者皆可3
OCTET STRING两者皆可4
NULL根底类型5
OBJECT IDENTIFIER根底类型6
Object Descriptor两者皆可7
EXTERNAL组合类型8
REAL (float)根底类型9
ENUMERATED根底类型10
EMBEDDED PDV组合类型11
UTF8String两者皆可12
RELATIVE-OID根底类型13
TIME根底类型14
Reserved15
SEQUENCE and SEQUENCE OF组合类型16
SET and SET OF组合类型17
NumericString两者皆可18
PrintableString两者皆可19
T61String两者皆可20
VideotexString两者皆可21
IA5String两者皆可22
UTCTime两者皆可23
GeneralizedTime两者皆可24
GraphicString两者皆可25
VisibleString两者皆可26
GeneralString两者皆可27
UniversalString两者皆可28
CHARACTER STRING组合类型29
BMPString组合类型30
DATE根底类型31
TIME-OF-DAY根底类型32
DATE-TIME根底类型33
DURATION根底类型34
OID-IRI根底类型35
RELATIVE-OID-IRI根底类型36

以上就是ASN.1中的类型和对应的值。接下来咱们看下这些类型是怎么进行编码的。

ASN.1都是以字节为单位的,一个字节是8bits,其中7-8bits示意的是Tag class。2个bits能够示意4种class,如下:

classvalue形容
Universal0ASN.1的native类型
Application1该类型仅对一种特定应用程序无效
Context-specific2这种类型依赖于context
Private3

6bit示意的是这个类型是简略类型还是组合类型,简略类型用0,组合类型用1。

还剩下5个bits,能够示意32个不同的值,然而对于ASN.1来说,它的类型是超出32范畴的,所以这5个bits只用来示意0-30的值的范畴。如下所示:

如果想要示意超出30范畴的值,那么能够应用两个byte,如下:

后面一个byte的1-5bits全副用1示意,前面一个byte的第8bit用1示意,剩下的7个bits用来示意实在的值。

长度

type编码之后就是length编码,length编码有两种格局,一种是确定长度的length,一种是不确定长度的length。

如果数据的长度是可预感的,那么咱们就能够应用确定长度的编码模式,如果长度是不确定的,那么就能够应用不确定长度的编码模式。

咱们看下不同类型的长度编码模式:

首先,如果是确定长度,并且长度比拟短的状况下,那么在8bit位设置为0,剩下的7个bits能够示意0-127范畴的长度状况。

如果长度超过了127,那么能够在8bit设置为1,并且剩下的7个bits示意的是前面存储长度的byte个数,byte个数的范畴是(1-126)。

如果是非固定长度,那么在8bit位设置为1,剩下的7bits设置为0。

所有bits都设置为1的是保留值。

在非固定长度的状况下,如果内容完结之后,须要额定附加一个byte示意的End-of-Contents,用来示意非固定长度编码曾经完结了。

内容

Contents是跟在长度前面的byte字段,Contents的长度能够为0,示意没有Contents内容。

总体来看BER编码,通过类型+长度+具体的内容字段来组成的。

CER编码和DER编码

CER的全称是Canonical Encoding Rules, DER的全称是Distinguished Encoding Rules,这两个编码都是从BER衍生过去的,他们都是BER的变体。

为什么会有这两个变体呢?首先考虑一下BER的定义,BER是Basic Encoding Rules,它是一个十分根底的编码规定,在很多状况下并没有提供具体的编码实现规定,所以须要具体的实现者自行对根底协定进行扩大。

那么对应的,如果一个实现者申明本人是反对BER编码协定的,那么就意味着这个实现者须要反对所有BER可能的变体编码规定。

BER为咱们提供了一个根底规范,它的可扩展性很强,尽管咱们在架构或者零碎利用中常常提到可扩展性,然而在某些状况下,可变性和可扩展性并不是咱们所心愿的。比方在密码学中,咱们心愿编码规定的是固定的。这样的状况就须要用到CER和DER编码。

CER和DER编码都是BER的扩大,他们和BER相比,只规定了一种具体的编码规定,所以他们的确定性更强。

CER和DER相比,CER应用的是不确定长度的格局,而DER应用的是确定长度的格局。这就是说DER中始终蕴含了前导的长度信息,而CER则是是用一个字节的内容结束符来示意编码的完结。

另外,在DER中,Bit string, octet string 和受限的字符串必须应用根底类型,不能应用组合类型。

DER被宽泛应用在数字证书中,比方X.509。

总结

以上就是X.690和对应的BER CER DER编码详解,看完本篇文章,你又多会了一门语言,oh yeah!

更多内容请参考 http://www.flydean.com/47-x690-ber-cer-der/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!