• 密码学的基础: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中,每个数据元素都被编码为类型标识符、长度描述、实际数据元素,以及可选的内容结束标记,如下所示:

    类型标识符|长度|实际数据|内容结束标记
    —|—|—|—|—
    Type|Length|Value|只用在不确定长度的情况

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

    类型标识符

    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/

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

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

  • 相关阅读:
    matlab调用python自定义函数模块进行数据分析总结
    故障分析 | MySQL 节点宕机分析一例
    关于响应式编程ReactiveX,RxGo
    C++程序员修炼手册--智能指针
    Turtlebot3-burger入门教程#foxy版#-OpenCR安装
    python类中调用未定义的函数
    江开2024年春《大学英语(B)(2) 060052》过程性考核作业4参考答案
    【Vue】同一个页面多次复用同一个组件数据相互干扰问题
    Matlab程序
    【数据结构】ArrayList与顺序表
  • 原文地址:https://blog.csdn.net/superfjj/article/details/126108128