ASN.1
是一个语言标准,可以与C语言进行类比,ASN.1的主要用途是描述数据结构,而C语言的主要用途则是控制程序走向。使用ASN.1可以描述复杂的数据对象。比如:一块数据中,哪里是长度,哪里是内容,哪里是标志等(类似C语言的struct)。
使用ASN.1描述的数据结构,需要具象化,也就是编码。ASN.1有多种不同的编码实现,BER,CER,DER等,其中DER是最见的一种,实际上还可以使用XML来进行编码,还可以转换为C语言的数据结构。
DER
是ASN.1的一种编码实现,是基于二进制的。
PEM
是64进制,这是一种信息编码格式,类似于HEX格式。
如果将DER及PEM文件进行对比,DER文件类似于二进制的BIN文件,PEM文件类似于十六进制的HEX格式文件。
举例说明:
你可以用 0x01 来表示数字1, 这就是二进制编码。
你也可以用ASCII码的 '1' 表示数字1,这就是HEX编码。
PEM编码(BASE64)就是指定了一系列符号,使用这些符号来表示特定的数字,参考下表:
Base64编码表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | |||
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |
X509
这是一个数据格式标准,它定义了数字证书的数据结构,数字证书中有诸多元素,如:版本号、公钥、所有者信息、数字签名等。这些元素必须以固定统一的数据结构组织起来,才能在不同实体直接传递,如果没有标准,则一家机构定义的证书格式只有他自己能用,别人没法用,最后全球可能存在成千上万种证书格式。而X509就是这样一个标准,告诉大家,版本号应该存在哪里,公钥存在哪里。。。有了这个统一的格式,大家都遵守它,所有的机构都只需要支持这一种证书格式即可。
X509是如何描述证书的数据结构呢? 答案是ASN.1,它使用了ASN.1来描述了数字证书的数据结构。X509格式的证书,具体的编码也会有多种,如DER编码格式,直接存储的DER编码的X509证书,通常后缀名就叫 x509.der或者der,使用PEM格式编码的X509证书后缀名通常叫x509.pem或pem。
题外话
PKCS#1标准中定义了RSA公私钥的数据结构,这个标准同样是使用ASN.1来描述数据结构的。
实际上很多计算机、数据、算法相关的标准都使用了ASN.1来描述数据结构。
我们不一定要去学习ASN.1的语法,但了解它的功能以及重要性还是很有必要的。
最后,文件后缀名不能代表其编码格式,后缀名是人起的,只要知道编码格式,随便用什么后缀名都行,只是为了方便,大家一般约定使用对应的编码作为后缀名。