简介

之前我们讲到了优秀的数据描述语言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
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,如下:

class value 描述
Universal 0 ASN.1的native类型
Application 1 该类型仅对一种特定应用程序有效
Context-specific 2 这种类型依赖于context
Private 3

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/

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

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

密码学的基础:X.690和对应的BER CER DER编码的更多相关文章

  1. 公钥体系(PKI)等密码学技术基础

    公钥体系(PKI)等密码学技术基础 公钥体系(Public Key Infrastructure, PKI)的一些概念 对称密码算法, 典型算法:DES, AES 加解密方共用一个密钥 加/解密速度快 ...

  2. 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码

    015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...

  3. CTF中密码学一些基础

    本文作者:i春秋签约作家MAX. 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密. 给大家先找两道题,来一起探讨基础密码学 ...

  4. 密码学数论基础部分总结之 有限域GF(p) Galois Fields

    今天花了一下午的时间学习密码学的数论部分,下面将学到的内容进行一下总结,也算是加深记忆.我本身对密码学这方面比较感兴趣,而且本节出现了许多数学公式,使用刚刚学习的LaTex公式来呈现出来,练习练习,何 ...

  5. CTF中密码学一些基础【三】

    本文作者:i春秋签约作家——MAX. 看看今天教程: 看着几个字符在键盘的位置,直接就是三个圈圈,圆心的三个字符就是答案 非常简单! 答案就是KEY 看题解密就好了!! 根据提示Asp encode解 ...

  6. 【Bootstrap基础学习】04 Bootstrap的HTML和CSS编码规范

    HTML 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格) 对于属性的定义,确保全部使用双引号,绝不要使用单引号. 不要在自闭 ...

  7. Python基础学习参考(五):字符串和编码

     一.字符串 前面已经介绍过字符串,通过单引号或者双引号表示的一种数据类型.下面就再来进一步的细说一下字符串.字符串是不可变的,当你定义好以后就不能改变它了,可以进一步的说,字符串是一种特殊的元组,元 ...

  8. python基础之小数据池、代码块、编码和字节之间换算

    一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽 ...

  9. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

随机推荐

  1. 从NSSRound#1学到了什么

    sql_by_sql 二次注入: 更改密码的功能形如: update user set password='%s' where username='%s'; 的语句就可以存在二次注入,即假设有个adm ...

  2. python DOS 攻击,TCP压测脚本

    pip3 install string&&scapy 1 #!/usr/bin env python 2 #-*-coding:utf-8-*- 3 import socket,ran ...

  3. Go基础3:函数、结构体、方法、接口

    目录 1. 函数 1.1 函数返回值 同一种类型返回值 带变量名的返回值 函数中的参数传递 函数变量 1.2 匿名函数--没有函数名字的函数 在定义时调用匿名函数 将匿名函数赋值给变量 匿名函数用作回 ...

  4. 使用 VS Code + Markdown 编写 PDF 文档

    背景介绍 作为一个技术人员,基本都需要编写技术相关文档,而且大部分技术人员都应该掌握 markdown 这个技能,使用 markdown 来编写并生成 PDF 文档将会是一个不错的体验,以下就介绍下如 ...

  5. python操作MySQL与MySQL补充

    目录 python操作MySQL 基本使用 SQL注入问题 二次确认 视图 触发器 事务 存储过程 函数 流程控制 索引 练习 python操作MySQL python中支持操作MySQL的模块很多, ...

  6. 关于『进击的Markdown』:第五弹

    关于『进击的Markdown』:第五弹 建议缩放90%食用 路漫漫其修远兮,吾将上下而求索.  我们要接受Mermaid的考验了呢  Markdown 语法真香(一如既往地安利) ( 进击吧!Mark ...

  7. Python 微博搜索爬虫

    微博搜索爬虫 网页分析 由于网页端反爬虫机制比较完善所以才去移动端进行爬虫. url地址:https://m.weibo.cn/ 搜索框,输入关键词进行搜索 对网页进行抓包,找到相关数据 查看数据是否 ...

  8. 是时候为Spring Boot 3.0做准备了

    2018年2月28日Spring Boot进入2.0时代,距今已经超过4年了. 2022 年 11 月 Spring Boot 3.0 将正式发布,它将基于 Spring Framework 6.0, ...

  9. bootstrap 4.0 dropdown 找不到popper.js 的解决方案

    最近项目中升级bootstrap 由3.3.7版 升了4.0版本 发现 dropdown 找不到popper.js 解决办法:npm install -save popper 下载完之后,查看node ...

  10. cool-admin vite-vue3 打包部署 nginx代理设置

    location /api {rewrite ^/api/(.*)$ /$1 break;proxy_pass http://xxx.com;}location /socket.io {rewrite ...