写点什么

密码学系列之:X.690 和对应的 BER CER DER 编码

作者:程序那些事
  • 2022 年 5 月 28 日
  • 本文字数:1818 字

    阅读完需:约 6 分钟

密码学系列之:X.690和对应的BER CER DER编码

简介

之前我们讲到了优秀的数据描述语言 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 中,每个数据元素都被编码为类型标识符、长度描述、实际数据元素,以及可选的内容结束标记,如下所示:



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

类型标识符

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



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


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



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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

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

发布于: 刚刚阅读数: 4
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
密码学系列之:X.690和对应的BER CER DER编码_密码学_程序那些事_InfoQ写作社区