当前位置: 首页 > 工具软件 > asn > 使用案例 >

ASN.1编码格式介绍

颛孙高义
2023-12-01

**

ASN.1

我是如何接触到ASN.1的?
是在查看ECC椭圆曲线签名算法ECDSA的go源代码的时候,发现其是使用ASN.1编码格式的。
**
ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
ASN.1 的描述可以容易地被映射成 C 或 C++ 或 Java 的数据结构,并可以被应用程序代码使用,并得到运行时程序库的支持,进而能够对编码和解码 XML 或 TLV 格式的,或一种非常紧凑的压缩编码格式的描述。
例子:

Report ::= SEQUENCE {
		author OCTET STRING,
		title OCTET STRING,
		body OCTET STRING,
		biblio Bibliography
	}

就如同我们使用编程语言所定义的结构体一样

而作为抽象语法标记,其核心是能够便于将数据结构转换成位流或者说字节流以便于进行传输

BER

BER是ASN.1最早定义的编码规则。BER传输语法的格式⼀直是TLV三元组<Type,Length,Value>,也叫做<Tag,Length,Value>。TLV每个域都是⼀系列⼋位组,对于组合结构,其中V还可以是TLV三元组。
其中TAG表示的即是数据类型,ASN.1 提供了一些基本的预定义数据类型:

UNIVERSAL 0 保留给编码规则使用
UNIVERSAL 1布尔类型
UNIVERSAL 2整型
UNIVERSAL 3零或多个比特的序列
UNIVERSAL4 零或多个字节的序列
UNIVERSAL5 NULL
UNIVERSAL 6 对象标识符类型
UNIVERSAL 7 对象描述符类型
UNIVERSAL 8 外部类型和类型实例
UNIVERSAL 9 实数类型
UNIVERSAL 10 枚举类型
UNIVERSAL 11 嵌入的 pdv 类型
UNIVERSAL 12 UTF8 字符串类型
UNIVERSAL 13 相关对象标识符类型
UNIVERSAL 14-15 保留给本建议的以后版本和国际标准使用
UNIVERSAL 16 序列和类型序列
UNIVERSAL 17 集合和类型的集合
UNIVERSAL 18-22, 25-30 字符串 类型
UNIVERSAL 23-24 时间 类型
UNIVERSAL 31-... 保留给本建议以外的类型和国际标准使用

ASN.1 还能够定义如下的数据结构类型:

结构 ( SEQUENCE )
列表 ( SEQUENCE OF )
类型选择 ( CHOICE )

Length是表示后面Value的长度

例子:
02 02 27 7f 30 13 31 11 30 0f 06 03 55 04 03 0c 08 68 61 6e 67 7a 68 6f 75
02是类型Integer
02表⽰Len
27 7f表⽰10111
30表⽰BPMString
13表⽰Len
31 11 30 0f 06 03 55 04 03 0c 08 68 61 6e 67 7a 68 6f 75 表⽰CN=hangzhou

参考:
1、https://wenku.baidu.com/view/7763a04a5bfafab069dc5022aaea998fcc2240f0.html
2、https://baike.baidu.com/item/ASN.1/498523?fr=aladdin

 类似资料: