关于算法:密码学的基础X690和对应的BER-CER-DER编码

49次阅读

共计 2971 个字符,预计需要花费 8 分钟才能阅读完成。

简介

之前咱们讲到了优良的数据描述语言 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
Reserved 15
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/

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

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

正文完
 0