1、ASN.1/BER/D编码子集 入 门指南 RSA实验室的 一份 技术 笔记 作者: Burton S. Kaliski Jr. 1993年 11月 1日 修订 摘 要: 本文简单介绍了OSI 抽象语法符号(ASN.1)的子集和 可辨别编码规则 (DER)。本文的主要目的是为理解和实现PKCS协议族提供足够的背景材料。 ER 基本编码 规则 (BER)翻 译 :Da vid Zhu Yang Zhang 译稿版 本: 1.0版 11、介绍 众所周知, 软件 开发管理 最主要的 设计原理 就是抽象 。 通过抽象, 设计者 可以定义 系统的一部分,而不需要关心 这部分实际上如何 实现或如 何表示。
2、这一方法使得实 现很 open,它简化了定 义过程 , 使得在 实现部件 之前可以 声明某 些 “公理 ”、 并且在 设计高层 部件时假 定下层部件是 可以实现 的。抽象 是现代多 数软件规 范的 特点。 作为当今最 复杂的系 统之一 ,开放系 统互联 ( OSI,在 X.200 种定义 )是一个 包含了大量抽象的例 子。 OSI 是一个国际通 用的标准 体系, 从 物理层一直 到用户应 用层, 管理着 计算机之间的互 联。 高层次 的对象被 抽象定 义, 并将由 底 层的对象来 实现。 比如 , 某层的 一个服务可能需要 在计算机 之间传递 某个抽象 对象; 某一 底 层则可能提 供关于 0
3、、 1 字符串 的实现,利用一些编 码规则把 高层的抽 象对象转 换成这些 字符 串。 OSI 之所以被称为开 放系统是 因为它在每一层 上支持不 同的服务 实现。 OSI 定义抽象对象的方法称为 ASN.1(Abstract Syntax Notation One,X.208) ,把这些对象转换成“0”和“ 1”的比特流的一套规则称为 BER(Basic Encoding Rules , X.209)。 ASN.1是一套灵活的记号,它允许定义多种数据类型,从 integer、 bit string 一类的简单类型到结构化类型,如 set 和 sequence,还可以使用这些类型构建复杂类型。
4、 BER 说明了如 何把每种ASN.1 类型的值编码 为 8bit 的 octet 流 。通常每个值有不止一种的 BER 编码方法。一般使用另外一套编码规则 DER,它是 BER 的一个子集 ,对每个 ASN.1 值只有唯一一种编码方法。 本文档的目 的是通过 描述 ASN.1、 BER 和 DER 的一 套子集, 以 便提供足 够的背景 知识理解和实现 一种基于 OSI 的应用 RSA 公司的 Public-Key Cryptography Standards。本文概括介绍 了 ASN.1、 BER 和 DER,列举 了一部 分 ASN.1 类型 和它们 的 BER/DER 编 码。第2 4
5、 节概括 介绍了 ASN.1、 BER 和 DER。第 5 节 列 出了部分 ASN.1 类型, 给出了它 们的符号、 详细的编 码规则和 举例, 并 介绍了其 在 PKCS 中的 应用。 第 6 节用一 个 X.500 distinguished names 例子作为总结。 本笔记没有 谈到 ASN.1 的高级 特点 (例 如宏) , 因 为 它们在实现 PKCS 时 并不必要。 关于其它特征 和更多细 节,请读 者参考 CCITT 的建议文档: X.208、 X.209,这 两份文档 中定义了 ASN.1 和 BER。 术语和符号 。本文中 , octet(字节)表示一个 8 bit 的无
6、符号整 数。 Bit8 表示最 高位,bit1 表示最低位 。 下列元语法 用于定义 ASN.1 符号 : BIT 类型和值用 等宽字体 表示。例 如,它通 常表示一 个 16进制的字节 值。 n1 粗斜体表示 变量 粗的方括号 表示该项 为可选项 粗体大括号 表示一组 相关项 | 粗体竖杠表 示一组之 中的可任 选其一 粗体省略号 表示重复 出现 = 粗体等号, 用一个子 项表示该 项 22. 抽象语法符号 抽象语法符 号一是描 述抽象类 型和值的 符号,缩 写为 ASN.1。 在 ASN.1 中,一个类型就是一个值的集合。有些类型有有限个值,有些则有无限多个。一个给定的 ASN.1 类型的
7、值是该类型集合里的一个元素。ASN.1 有四种类型: 简单类 型 ,它相当于原子,没有组件; 结构类型 ,有组件; 标签类型 ,由其他类型生成 ; 其他类型 ,包括 CHOICE 和 ANY 类型。可以使用 ASN.1 的分配符( :=)给类型和值指定名字,这些名字可以用于定义其他类型或值。 除了 CHOICE 和 ANY 类型以外, 每种 ASN.1 类型 都有一个标 签,由一 个类和一 个非负的标签数 组成。标 签值可以 唯一区分 ASN.1 类型 。也就是说,ASN.1 类型的名字并不影响它的抽象含义,只有标签才有这个作用。有四类标签: Universal: 该类型的 含义在 所有的 a
8、pplication中都相 同。这 种类型 只在 X.208中定义。 Application: 该类型 的含义由 application决定, 如 X.500目录服务 。两个 不同 的application中的类型可以具有相同的 application-specific标签但是不同的 含义。 Private: 该 类型的 含义根据 给定的企 业而不同 。 Context-specific: 该类 型的含义 根据给定 的结构类 型 而不同。 Context-specific标签用于在一个 给定的结 构类型上 下文中区 分使用相 同的 下层标签的 组件类型 。在两个不同 的结构类 型中组建 类型可
9、以 具有相同 的标 签但是含义 不同。 具有 universal 标签的类 型在 X.208 中定 义, X.208 也 给出了类型 的 universal 标签值 。 使用其他标签 的类型在 很多地方 都有定义 ,通常是 通过 implicit 或 explicit 标签获得。表一列出了部分 ASN.1 类型 及其 universal-class 标签。 Type Tag number (decimal) Tag number (hexadecimal) INTEGER 2 02 BIT STRING 3 03 OCTET STRING 4 04 NULL 5 05 OBJECT IDENT
10、IFIER 6 06 SEQUENCE and SEQUENCE OF 16 10 SET and SET OF 17 11 PrintableString 19 13 T61String 20 14 IA5String 22 16 UTCTime 23 17 ASN.1 类型和值使用 一种灵活 的、类似 编程语言 的符 号表示,规 则如下: z 分层(换行 )无特殊 意义;多 个空格和 多个空行 相当 于一个空格 。 z 注释由一对 连字符( -) 开头,或 者一对连 字符和 一 个空行 z 标识符(值或字段的名字)和类型索 引(类型的名字 )由大小写字母、数字、连字符和空 格组成; 标识符
11、由 小写字母 开头,类 型索 引由大写字 母开头。 3下面的四个 子节概括 介绍了简 单类型、 结构类型 、隐 式和显式标 签类型, 及其他类 型。第 5 节定义 了类型的 更多细节 。 2.1 简单 类型 简单类型没 有子组件 ,是“原子级”的类型。 ASN.1定义了几个简单类型,其中与PKCS标准有关的类型如下: z BIT STRING:由 0和 1任意组成的比特流 z IA5String:由 IA5(ASCII)字符任意组成的字 符流 z INTEGER:一个任意的整数 z NULL:null值 z OBJECT IDENTIFIER:对象标识符,有一 列整数构 成,用于确 定对象,
12、如算法或属性类型 z OCTET STRING:任意的 octet( 8 bit值)流 z PrintableString:任意可打印字符流 z T61String:T.61( 8bit)字符的任意流 z UTCTime:“coordinated universal time“或者格林 威 治平均时( GMT)值。 简单类型分 为两类: string 类型和 non-string 类型。 BIT STRING, IA5String, OCTET STRING, PrintableString, T61String, 和 UTCTime 是 string 类型。 考虑到编码, String 类型
13、可以视为由组件 组成, 组件 是 substring。 这样即使事先不知道值的长度也 可以使用 结构化的、 不定长的 编码方 式进 行编码 (例如 , 从一个 file stream 中输入的 octet string 值) 。 String 类型可以指定大小限制 ,以限 制值的长 度。 2.2 结构类型 结构类型由 组件组成 。ASN.1 定义了四种,都与 PKCS 标准有关: z SEQUENCE:一个或多个类型的有序 集合 z SEQUENCE OF:0个或某个给定类型多次 出现的有 序 集 合 z SET:一个或多个类型的无 序集合 z SET OF:0个或某给定类型多次 出现的无 序
14、集合 结构类型允 许有可选 组件。可 选组件可 能有默认 值。 2.3 隐式和显 式标签类型 在一个 application 中标签 ( tagging) 对于区分类型十 分有用, 标签通 常也用 于在一个 结构类型中区分 组件类型 。例如, SET 或 SEQUENCE 类型的可选组 件一般都 给予不同的context-specific 标签以避免混淆。 有两种方法 可以标记 一个类型 :隐式 (implicitly)和显式 (explicitly)。 隐式标签类 型是在其 它类型基 础上通过 改变其下 层类 型的标签而 生成的。 隐式 标签使用ASN.1 关键词 class number
15、IMPLICIT(见第 5.1 节)表示。 显 式 标 签是在 其他 类型 基础上 通过 在其下 层类 型的 标签 之外 添加一 个外 层标 签而生 成的。 从效果上 看, 显式 标签类型 是包含一 个组件的 结 构类型, 该组 件即下层 类型。 显 式标签由 ASN.1 关键词 class number EXPLICIT(见第 5.2节)表示。 4除非“模块 ”的 ASN.1 类型默认定 义为隐式 标签, 关键词 class number默认 总是与使用显式标 签相同。 ( “模块” 属于高级 特性,不 在本 文档描述范 围内) 从编码的角 度看, 隐式标 签类型可 视为与下 层类型相 同,
16、 只是标签不 同。 显式标签 类型可视为有一 个组件的 结构类型, 该 组件即为 下层类型 。 隐式标签可以 使编码较 短, 但是如果下层类型是 不确定的 ,显式标 签必须避 免含糊不 清( 例如下层类 型是 CHOICE 或 ANY) 。 ASN.1 中的其它类型 包括 CHOICE 和 ANY 类型。 CHOICE 类型表示一 个联合体, 它具有一个或多个备选项( alternative) ; ANY 类型表示任意类型的任意值,其中任意类型可能在使用对象 识别符或 整数值注 册中定义 。 3. 基本编码规则( Basic Encoding Rules) ASN.1 的基本编码规则定 义了一
17、种 或多种把 任意 ASN.1 值表示成 字节字符 串的方法 ,缩写为 BER。 (当 然还有其 它的方法 ,但是 BER 是 OSI 中转换这些值的标准 ) 使用 BER,一个 ASN.1 的值有三种编码方法,选择哪种取决于值的类型和值的长度是否已知。这三种方法是: 简单定 长编码 ,结 构化定 长编 码, 及结构 化不定 长编 码 。简单的non-string 类型使用第一种(简单定长编码);结构化类型可使用任一种结构化的编码方法;简单的 string 类型根据值的长度是否已知可使用任一种方法。隐式标签定义的类型可使用下层类型的方法,显式标签定义的类型使用结构化的编码方法。 每种 BER
18、编码方 法都有三 或四部分 : z Identifier octets:定义 了 ASN.1 值的类和 标签值, 指明 编码方法是 简单的还 是结构化的。 z Length octets:对于定长编码 方法,它指出了 内容字 节个数;对于结构化非 定长编码方法,它 指明长度 是不确定 的。 z Contents octets:对于 简单定长编码方法,它给出 了 值的具体表示;对于结构化的方法,它给 出了值内 容的 BER编 码的串联 。 z End-of-contents octets:对于结构 化非定长 的编码方 法,它表示 内容结束 ;对于其它方法,没 有该部分 。 在下面的章 节中介绍
19、了这三种 编码方法 。 3.1 简单定长 方法( Primitive, definite-length method) 这种方法用 于简单类 型及通过 对简单类 型使用隐 式标 签生成的类 型。 它要求值 的长度是事先预知的 。 BER 编码的 部分定义 如下: 1. Identifier octets, 有 两种形式 : 较 小的标签 值 ( 标 签 值 在 0 和 30 之间) 和较大的 标签值(标签 值大于等 于 31) z Low-tag-number form: 一 个字节 。 Bit8和 bit7表 示 类 (如表 2), bit6值为 0,表 示编码方法为 简单化的 。 Bit5
20、 1给出了标 签值。 5Class Bit 8 Bit 7universal 0 0 application 0 1context-specific 1 0 private 1 1z High-tag-number form: 两个 或多个 octet。第一个 octet形式如 low-tag-number form,但是 bit5 1均为 1。第二个和以后的字节给出 标签值,基于 128,最高位在先, 以便 使用尽可 能少的数 字, 除了最后 一个字节 以 外 , 每 个 字节的 bit 8都置 为 1。最后一个字 节的为 0。 2. Length octets: 有两种 格式: 短型 (长
21、度在 0 至 127 之间 ) 和长型 (长 度在 0 至 210081之间) z Short form: 一个字节, bit8为 0, bit 7 1表 示长度。 z Long form: 2 127个字节 。 第 一 个字节的 Bit 8为 1, bit 7 1表示后 面有多少 个用于表示实际长 度的 octet。 第二个和随 后的 octet给出实际 长度, 基于 256, 高位数字 在先。 3. Contents octets: 给出了 值的具体 表示(如 果类型是 由隐式标签 定义的, 则给出了下层类型的 值) ,特定 类型的细 节详见 第 5 节。 3.2 结构化定 长方法( Co
22、nstructed, definite-length method) 结构化定长 方法适用 于简单的 string 类型、 结构类型 、 在二者基础 上通过隐 式标签 生成的类型和在任何类型基础 上由显式标签生成 的类型。 要求值的长度事先已知。 BER 编码方法各部分如 下: 1. Identifier octets: 与第 3.1 节 介绍的一 样, 但 bit6 的值 为 1, 表示编码 方法是结 构化的。 2. Length octets: 见第 3.1 节。 3. Contents octets, 值的组 件的 BER 编码 的串联 z 对于简 单 string类 型和在 其基 础上
23、 由隐 式标 签生 成的 类型, 是值 的连 续子 串的BER编码的串 联(隐式 标签的下 层值) z 对于结构类型和在其基础上由隐式标签生成的类型, 是值的组件的 BER编码的串联(隐式 标签的下 层值) z 对于在任何 类型基础 上使用显 式标签生 成的类型 ,是 下层值的 BER编码 特定类型的 细节见第 5 节。 3.3 结构化非 定长方法( Constructed, indefinite-length method) 结构化的 、 非定长 编码用于 简单 string 类型、 结构类 型、 在二 者基础上 使用隐式 标签生成 的 类 型 和 在 任 何 类 型 基 础上使 用显 式标
24、 签生 成的 类型 。不 要求 事先 知道 值的 长度。 BER编码各部分 如下: z Identifier octets, 见第 3.2 节 z Length octets.一个字 节,值为 80 z Contents octets.见第 3.2 节。 z End-of-contents octets 两个字节 ,为 00 00。 6由于 end-of-contents octet 通常出现在普通 BER 编 码 出现的位置 (例如, 在一个 sequence值的 内容 octet 出现的 位置 ) ,可 把 00 和 00 分别 视为 identifier 和 length octet。因
25、此end-of-contents octet 实际上是一个具有 universal class, 标签值为 0,长 度为 0 的值 的简单定长编码。 4. Distinguished Encoding Rules(DER,可辨别编码规则 ) DER 是 BER 的子 集,它定 义了使用 一个 octet string 来表示任何 ASN.1 值 的编码方 法。DER 用于需 要使用唯 一的 octet string 编码的应用程序 ,例如根据 一个 ASN.1 编码来 计算数字签名。 DER 在 X.509 的第 8.7 节定 义。 DER 在第 3 节给出的 规则基础 上增加了 如下限制 :
26、 1. 如果长度在 0 127 之 间,必须 使用短型 长度表 示法 。 2. 如果长度大 于等于 128,必须 使用长型 长度表示 法。 并且长度必 须使用尽 可能少的字节表示。 3. 对于简单 string 类型和在其基础上使用 隐式标签 生成 的类型,必 须使用简 单定长编码方法。 4. 对于结构化 类型和在 其基础上 使用隐式 标签生成 的类 型、 及在任 何类型基 础上使用显式标签生 成的类型 ,必须使 用结构化 定长编码 方法 。 对于特殊类 型 ( 如 BIT STRING、 SEQUENCE、 SET 和 SET OF) 的其他限制见第 5 节。 5. 某些类型的符号和编码 本
27、节给出了 部分 ASN.1 类型的符 号,并介 绍了如何 使 用 BER 和 DER 对这 些类型进 行编码。 这里介绍的 类型是第 2 节提到 的,按字 母顺序列 在下 面。 每个介绍包 括 ASN.1 符号、 BER 编码 和 DER 编码。 编码的重点 主要在内 容字节上, 标签和长度字 节遵循第 3、 4 节的 介绍。介 绍还解释 了 每种类型用在 PKCS 中何处及相 关的标准。 ASN.1 符号主要是针 对类型的, 但 还是针 对 OBJECT IDENTIFIER 给出了类型符号 和值符号。 5.1 隐式标签 类型 隐式标签类 型是在其 他类型基 础上通过 改变下层 类型 的标签
28、生成 的类型。 隐式标签在 整个 PKCS 中用于可选 的 SEQUENCE 组 件,其下层 类型是除 ANY 以外的任何类型。 也用于 PKCS #7 的 ExtendedCertificateOrCertificate 类型的 extendedCertificate 备选项。 ASN.1 表示法 : class number IMPLICIT Type class = UNIVERSAL | APPLICATION | PRIVATE 其中, Type 是类型 , class 是可选的 class 名, number 是类内的标签值 ,是一个 非负整数。 在默认标签 方法为隐 式标签的 A
29、SN.1 模 块中,也 可以 使用 class number Type 符号,关键词 IMPLICIT 是隐含的(见第 2.3 节) 。在模 块以外的地 方进行定 义声明, 最好使用7关键词 IMPLICIT 以避免语义含混。 如果没有 class 名称,则标 签为 context-specific 类。 context-specific 类型的标签只 能出现在 结构类型 或 CHOICE 类型的组件 中。 例: PKCS #8 的 PrivateKeyInfo 类型有一个可选 的 attributes 组件,具有一个隐式的、 context-specific 标签: PrivateKeyIn
30、fo := SEQUENCE version Version, privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, privateKey PrivateKey, attributes 0 IMPLICIT Attributes OPTIONAL 这里,下 层类型为 Attributes, class是缺省的( 即 context-specific类),在这个类内的 标签值为 0。 BER encoding: 根据下 层类型可 以采用简 单化的或 结 构化的编码 。内容字 节与下层 值的 BER编码有关。 例:一个 PrivateKeyInfo值
31、的 attributes组件 的 BER编码如下: z 如果下层的 Attributes值采用简单化的 BER编码 ( bit 6为 0),则 identifier octet为 80;如果采用结构化的编码 ( bit 6为 1),则 identifier octet为a0。 z length和 content octet分别与下层 Attributes值的 BER编码的相同。 DER encoding: 根据下层类型 选择简单 或结构化 编 码方法。 Content octet 与下层值的DER 编码有 关。 5.2 显式标签 类型 显示标签通 过在一个 类型的外 层增加一 个标签可 以生
32、成一个新的 类型。 在整个 PKCS 中,显式标 签用于下 层类型为 ANY 的 、可选的 SEQUENCE 类型组件 ,及 X.509 的 Certificate 类型的 version 组件。 ASN.1 表示法 : class number EXPLICIT Type class = UNIVERSAL | APPLICATION | PRIVATE Type 表 示类型, class 是 一个可选 的类名, number 是一个非负 整数,表 示在类内 的标签值。 如果没有类名,则标 签为 context-specific 类。 Context-specific 类标签只能出现在SEQ
33、UENCE、 SET 或 CHOICE 类型的 组件中。 在默认标签 方法为显 式标签的 ASN.1 模 块 中 , 也可以 使用 class number Type 符号,关键词 EXPLICIT 是隐含的(见第 2.3 节) 。在模块 以外的地方 进行定义 声明,最 好显式写明关键词 EXPLICIT 以避免语义不清。 例: PKCS #7 中的 ContentInfo 类型有一个可选的 content 组件, 具有一 个显式的、context-specific 类的标签: ContentInfo := SEQUENCE contentType ContentType, 8content
34、0 EXPLICIT ANY DEFINED BY contentType OPTIONAL 这里 下层 的类 型为 ANY DEFINED BY contentType,类名省略 了( 即为context-specific 类) ,类内的标签值 为 0。 例 2: X.509 的 Certificate 类型有一个 version 组件, 具有显 式的 context-specific类标签,其 EXPLICIT 关键词省略了: Certificate := . version 0 Version DEFAULT v1988, . 这个标签是 显式的 , 因 为 在 X.509 中, ASN
35、.1 模 块 的 默认标签方 法定义 Certificate 类型为显式 标签。 BER encoding. 结构化编码。 Contents octets 与下层值的 BER 编码有关 。 例: ContentInfo 值的 content 组件的 BER 编码如下: z identifier octets为 a0 z length octets为下层 ANY DEFINED BY contentType值的 BER编码 长度 z contents octets为下层 ANY DEFINED BY contentType值的 BER编码 DER encoding. 结构化编码。 Content
36、s octets 与下层值的 BER 编码有关 。 5.3 ANY ANY 类型用于表示任意 类型的一 个任意值, 其中任意 类型可能在 对象描述 符的注册 中定义,或与一 个整数值 相关。 ANY 类型用于 PKCS #7 中的 ContentInfo 类型中 特定的 content 值,或 X.509s AlgorithmIdentifier 类型中特定算法的 参数 ,或 X.501 中 Attribute 类型和AttributeValueAssertion 类型的属性值。 Attribute 类型广泛应用在 PKCS #6, #7, #8, #9 and #10 中, Attribut
37、eValueAssertion 类 型用于 X.501 DN 中。 ASN.1 表示法 : ANY DEFINED BY identifier 这里 identifier 是 可选的识 别符。 在 ANY 形式下,实际的 类型是不 确定的。 ANY DEFINED BY identifier 形式只能 出现在 SEQUENCE 或 SET 类型的组件中,对于这些组件 identifier 定 义了一些 其他的组 件,其类 型 为 INTEGER 或 OBJECT IDENTIFIER(或者是在这两 者基础上添 加标签生成 的类型) 。这 种形式下,实际 的类型由其 他组件的值决定,其他 组件的
38、值 可能由对 象描述符 注册也可 能在 一个整数表 里。 例: X.509 的 AlgorithmIdentifier 类型有一个 ANY 类型的组件: AlgorithmIdentifier := SEQUENCE algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL 这里 parameter 组件的实际类型 由 algorithm 组件的值决定。 实际类型 在组件 的对象描述符的 注册中定 义。 9BER encoding. 与实际值的 BER 编码 相同。 例: parameter 组件的 BE
39、R 编码值是实际类 型值的 BER 编码。实际类型在algorithm 组件的对象描述符值的 注册中定 义。 DER encoding. 与实际值的 DER 编 码相同。 5.4 BIT STRING BIT STRING 类型表示任意的 0和 1的比 特 流 。一个 BIT STRING 值的长度可以是任意值,包括 0。 该类型为 string 类型。 BIT STRING 类型用于 PKCS #6 ExtendedCertificate 类型中的 extended certificates 的 digital signatures,或 X.509 Certificate 类型的 certi
40、ficates 的 digital signatures,或 X.509 SubjectPublicKeyInfo 类型的 certificates 的 public keys。 ASN.1 表示法 : BIT STRING 例: X.509 的 SubjectPublicKeyInfo 类型有一个 BIT STRING 类型的组件: SubjectPublicKeyInfo := SEQUENCE algorithm AlgorithmIdentifier, publicKey BIT STRING BER encoding. 简单或结构化的编码。在简单编码 中,第一个内容字节指出了该 bi
41、t string 凑成 8 的倍数所缺少 的 bit 数(这些 bit 称为 无 用的比特) 。 第二个和 随后的内 容字节指出了转换 成字节字 符串的 bit string 的值。转换过程 如下: 1. 在 bit string 的结尾填充 0 至 7 个任意值 的比特, 使整 个 bit string 的长度是 8 的倍数。如果比 特流的长 度已经是 8 的倍数 ,则不需 要填 充 2. 填充后的比 特流被分 成 octet。 前八个 bit 作为第一个 octet, 分别为 bit8 至 bit1;这样一直分割 下去,直 到最后 8 个 bit 组成 octet。 在结构化编 码中, c
42、ontents octets 是 bit string 连续子串的 BER 编码的串 联。 除了 最后一个子串,每 个子串都 是 8bit 的整数 倍。 例: BIT STRING “011011100101110111“的 BER 编 码可以是下 列任意一 种,区别 在于填充比特的 选择、长 度字节的 格式、及 编码是简 单还 是结构化的 。 03 04 06 6e 5d c0 DER encoding 03 04 06 6e 5d e0 padded with “100000“ 03 81 04 06 6e 5d c0 long form of length octets 23 09 co
43、nstructed encoding: “0110111001011101“ + “11“ 03 03 00 6e 5d 03 02 06 c0 DER encoding. 简单编码。 内容字节与 BER 简单编码 类似, 只是填充 比特全部 为 0 bit。 例: BIT STRING 的 “011011100101110111“ DER 编码为: 03 04 06 6e 5d c0 105.5 CHOICE CHOICE 类型表示一个或多个备选 项的联合 体。 CHOICE 类型用于表示扩展证书 的联合体和 PKCS #7 的ExtendedCertificateOrCertificate
44、 类型中的 X.509 证书。 ASN.1 表示法 : CHOICE identifier1 Type1, nullnull, identifiern Typen 这里 identifier1, , identifiern是 可选的 ,不同 的 identifiers 表示不同的备选项。Type1, , Typen是备选 项的类 型。 Identifiers 主要是为了书 面表示, 并不 影响类型 的值或类型的编 码。 类型必须具 有不同的 标签值。 可以在备 选项上添 加显 式或隐式标 签来满足 此要求。 例: PKCS #7 的 ExtendedCertificateOrCertifica
45、te 类型是一个 CHOICE 类型: ExtendedCertificateOrCertificate := CHOICE certificate Certificate, - X.509 extendedCertificate 0 IMPLICIT ExtendedCertificate 这里备选项的 identifiers 是 certificate 和 extendedCertificate,备选项的类型是 Certificate 和 0 IMPLICIT ExtendedCertificate。 BER encoding. 与被选中的选项的 BER 编 码相同。 由于备选项 的标签值
46、 不同,所 以可以区分出不 同的 BER 编码 。 例: 如果选择 certificate 选项,则 BER 编码的 identifier octets 是 30,如果选择的是 extendedCertificate 选项则为 a0。 DER encoding. 与被选中的选项的 DER 编码 相同。 5.6 IA5String IA5String 类型表示由 IA5 字符组成的任意流 。 IA5 代表 International Alphabet 5,与ASCII 相同。该字符集包括不 可打印的 控制字符 。一 个 IA5String 值长度可以为任意值 ,包括 0。该类型 属于 strin
47、g 类型。 IA5String 类型用于 PKCS #9 的 electronic-mail address, unstructured-name, and unstructured-address 属性。 ASN.1 表示法 : IA5String BER encoding. 简单或结构化的 编码方式。 使用简单 编码方式时, 内 容字节 为 IA5 string格式的字符 , 用 ASCII 编码。 如果使用结构化 编码方 式, 内容字 节为 IA5 string 格式的连续子串的 BER 编码 的串联。 11例: 根据长度字节的形式和采用简 单还是 结构化编码方式, IA5String
48、““ 的 BER 编码可以是下列 任一种: 16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d DER encoding 16 81 0d long form of length octets 74 65 73 74 31 40 72 73 61 2e 63 6f 6d 36 13 constructed encoding: “test1“ + “ + ““ 16 05 74 65 73 74 31 16 01 40 16 07 72 73 61 2e 63 6f 6d DER encoding. 简单化编码。 Contents octets 与 BER
49、编码相同。 例: IA5String 类型值 ““ is 的 DER 编码为: 16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d 5.7 INTEGER INTEGER 类型表示任意的整 数。 INTEGER 值可以为正数、负数 或 0,具有任 意大小 。 在整个 PKCS 中 INTEGER 类型用于表示版本号 ;也 用于表示密 码值,如在 PKCS #1的 RSAPublicKey和 RSAPrivateKey类型及 PKCS #3的 DHParameter类型中的模数、指数或素数 等;在 PKCS #5 的 PBEParameter 类型中表示信息 摘要重复 次数;在 X.509 Certificate 类型中表示版本号 和序列号 。 ASN.1 表示法 : INTEGER identifier1(value1) identifiern(valuen) 这里 identifier1,