在了解DLMS/COSEM应用层协议的时候有必要了解一下ASN.1、BER、A-XDR。
这里只对部分做记录。
参考资料:ASN.1、BER和DER的PKCS相关子集入门介绍_golang asn1-CSDN博客
1、介绍
抽象语法表示法一(ASN.1)、基本编码规则(BER)和区别编码规则(DER)
ASN.1(Abstract Syntax Notation One)是一种用于描述数据结构的标准化语法。它的主要目的是提供一种平台和语言独立的数据表示方法,使得不同系统之间能够理解和交换数据。
BER(Basic Encoding Rules)是ASN.1数据的编码规则之一。它定义了如何将ASN.1定义的数据结构转换为二进制格式,以便在网络上传输或存储。
A-XDR(Abstract External Data Representation)是XDR(External Data Representation)的一个增强版本。XDR是一种用于描述数据的编码标准,主要用于在不同系统之间交换数据时进行编码和解码。
DER(Distinguished Encoding Rules)是ASN.1(抽象语法表示法第1版)数据编码的一个子集,属于一种确定性编码规则。它是BER(基本编码规则)的一个简化和规范化版本,主要用于需要精确和唯一编码的数据场景,如安全协议和证书。
2、ASN.1
ASN.1 has four kinds of type:
simple type、structured types、tagged types、other types
university、application、private、context-specific
3、BER
primitive, definite-length encoding;原始的定长的编码方法;
在每种方法中,BER编码三个或者四个部分:
标识符八位组(Identifier octets):这部分区分ASN.1值的类别和标签号码(class and tag number),并指示使用的编码方法是原始的还是结构化的。
长度八位组(Length octets):
对于定长编码方法,这部分给出内容八位组(content octets)的字节数量;
对于结构化非定长编码方法,这部分用于指示内容八位组的字节数量是不确定的。
内容八位组(Content octets):
对于原始的定长编码方法,这给出值的一个实质表示;
对于结构化的编码方法,这给出其组件值的BER编码值的一个串联结果。
结束标志八位组(End-of-content octets):对于结构化的非定长的方法,这部分知识内容字段的结束。对于其他的编码方法,这个字段是不存在的。
2.1Identifier octets
1. 标识符八位字节分为两种形式:低标签号形式(标签号在0到30之间)和高标签号形式(标签号为31及以上)。
2. 低标签号形式使用一个八位字节,其中第8和第7位指定类别(见表2),第6位值为"0"表示编码为原始类型,第5至第1位给出标签号。
3. 类别编码在标识符八位字节中的表示如下:通用类别为00,应用类别为01,上下文特定类别为10,私有类别为11。
4. 高标签号形式使用两个或更多的八位字节,第一个八位字节与低标签号形式相同,但第5至第1位的值均为"1"。
5. 第二个及后续的八位字节以128为基数给出标签号,最高有效数字先出现,尽可能少的数字,并且除了最后一个八位字节外,每个八位字节的第8位都设置为"1"。
3.2 length octets
原文介绍:
3.3contents octets
4、DER
1. ASN.1的Distinguished Encoding Rules(DER)是Basic Encoding Rules(BER)的一个子集,它为任何ASN.1值提供了一种唯一的八位字节字符串表示方法。
2. DER适用于需要唯一八位字节编码的应用场景,例如在计算ASN.1值的数字签名时。
3. DER在X.509标准的第8.7节中定义,它对长度表示添加了特定的限制:长度在0到127之间时,必须使用短形式;长度为128或更大时,必须使用长形式,并且长度必须用最少的八位字节表示。
4. 对于简单字符串类型和从简单字符串类型派生的隐式标记类型,必须使用原始的、确定长度的方法。
5. 对于结构化类型、从结构化类型派生的隐式标记类型以及从任何类型派生的显式标记类型,必须使用构造的、确定长度的方法。特定类型的其他限制(如BIT STRING、SEQUENCE、SET和SET OF)可以在标准的第5节中找到。