ASN.1/BER/DER编码子集入门指南(转)

原文地址:http://hi.baidu.com/ling1026/blog/item/c93972af17039ef3fbed5034.html

摘要:本 笔记提供了关于OSI提出的 ASN.1(Abstract Syntax Notation One)/BER(Basic Encoding
Rules) /DER(Distinguished Encoding Rules)的入门指南。本文的主要目的是提供充分的背景细节资料,以便于让读者更好地理解和
实现PKCS系列标准。

译者注:关于安全或者通信,编码是件很基本的事情,无论对于设计人员还是编码人员来说,都是必不可少的。本人希望
通过翻译本文,为那些面对ASN.1编码一筹莫展的人或者因为对ASN.1编码一知半解而常常苦恼的人――提供帮助。在翻译本文之后,本人将利用JCE或
某些Java厂商的java包来演示如何解析和构建ASN.1编码的对象。



1、介绍


     总所周知,抽象是解决软件开发问题的有效手段。利用抽象,设计人员可以定义系统的一个部分而不用关注这个部门实际上是如何实现或者表达的。这一方法使得实现 很open,它简化了定义过程,使得在实现部件之前可以声明某些“公理”、并且在设计高层部件时假定下层部件是可以实现的。抽象是现代多数软件规范的特
点。

     作为当今最复杂的系统之一,开放系统互联(OSI)是一个包含了大量抽象的例子。OSI是一个国际通用的标准体系,从物理层
一直到用户层,规划了计算机之间的互联。高层次的对象被抽象定义,并将由底层的对象来实现。比如,某层的一个服务可能需要在计算机之间传递某个抽象对象;
某一底层则可能提供关于0、1字符串的实现,利用一些编码规则把高层的抽象对象转换成这些字符串。OSI之所以被称为开放系统是因为它在每一层上支持不同
的服务实现。

     OSI的说明抽象对象的方法叫做抽象语法标记(ASN.1,在X.208中定义),而用0、1字符来表示这样的对象
的规则集合叫做基本编码规则(BER)。ASN.1是一个很灵活的标记法,它允许定义众多的数据类型――从整数和位串等简单类型到如集合、序列等的结构,
还可以是其它复杂定义的类型。BER描述了如何将ASN.1类型表示和编码成八位字节串。通常不止一种编码给定数据的方法,另一种叫做
DER(Distinguished Encoding
Rules)的编码集合,它是BER的子集,其特点是给每一个ASN.1值一个唯一的编码。

     本笔记的目的是充分地描述ASN.1/BER/DER编码子集,以便于理解和实现基于OSI的应用和RSA数据公司的PKCS标准。本笔记包括关于
ASN.1/BER/DER的概述、经过删节的ASN.1类型列表和它们的BER/DER编码。2-4节给出了一个ASN.1/BER/DER的概述,第
5节列出了一些ASN.1类型,给出了他们的表示法、特定的编码规则、例子和它们对于PKCS的应用情况。第6节以X.500区别名称为例做了一个总结。

    
本笔记没有谈到ASN.1的高级特点(例如宏),因为它们在实现PKCS时并不必要。关于其它特征和更多细节,请读者参考CCITT的建议文档:X.208、X.209,这两份文档中定义了ASN.1和BER。

术语和表示法
本笔记中,字节指8位无符号整数,第8位最重要,而第1位最不重要。以下表示法将用来表示ASN.1标记:

     BIT  
用等宽在类型和值标记中表示文本字符;例如,它表示十六进制中的一个字节值。
    [i]n1[/i]   
宽体斜体表示一个变量
    [ ]       方括号表示一个条款是可选的
    {
}
      大括号表示相关条款
    |     
竖条表示可以在一组值中任选
    ...     省略号表示多次重复
    =
      等号表示条目由一些子条目来表达。


2. 抽象语法标记(Abstract Syntax Notation One)


     抽象语法标记(Abstract Syntax
Notation One)是描述抽象类型和值的标记,缩写为ASN.1。

     在 ASN.1中,一个类型就是值的一个集合。有些类型有有限个值,有些则有无限多个。一个给定的ASN.1类型的值是该类型集合里的一个元素。ASN.1有
四种类型:简单类型,它相当于原子,没有下层组件;结构类型,有组成部分;标签类型,由其它类型生成;其它类型,包括CHOICE和ANY类型。可以使用
ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。

    
除了CHOICE和ANY类型以外,每种ASN.1类型都有一个标签,由一个类和一个非负的标签数组成。标签值可以唯一区分ASN.1类型。也就是说,ASN.1类型的名字并不影响它的抽象含义,只有标签值才有这个作用。有四类标签:
    

    ●Universal:该类型的含义在所有的application中都相同。这种类型只在X.208中定义。
        
    ●Application:该类型的含义由application决定,如X.500目录服务。两个不同的application中的类型可以具有相同的application-specific标签但是可以具有不同的含义。
        
    ●Private:,该类型的含义根据给定的企业而不同。
        
    ●Context-specific:该类型的含义根据给定的结构类型而不同。Context-specific标签用于在一个给定的结构类型上下文中区分使用相同的下层标签的组件类型。在两个不同的结构类型中组件类型可以具有相同的标签但是含义不同。

    
具 有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 IDENTIFIER__________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类型和值使用一种灵活的、类似编程语言的符号表示,规则如下:
    
    分层(换行)无特殊意义;多个空格和多个空行相当于一个空格。
         注释由一对连字符(--)开头,或者一对连字符和一个空行
        
    识别符(值或字段的名字)和类型索引(类型的名字)由大小写字母、数字、连字符和空格组成;识别符由小写字母开头,类型索引由大写字母开头。

    
下面的四个子节概括介绍了简单类型、结构类型、隐式和显式标签类型,及其他类型。第5节定义了类型的更多细节。

2.1 简单类型(Simple types)


    
简单类型没有组件,是“原子级”的类型。ASN.1定义了几个简单类型,其中与PKCS标准有关类型如下:
    
    ●BIT STRING:由0和1任意组成的比特流
         ●IA5String:由IA5(ASCII)字符任意组成的字符流
        
    ●INTEGER:一个任意的整数
         ●NULL:null值
         ●OBJECT
    IDENTIFIER:对象识别符,有一列整数构成,用于确定对象,如算法或属性类型
         ●OCTET
    STRING:任意的octet(8bit值)流
         ●PrintableString:任意可打印字符流
        
    ●T61String:T.61(8bit)字符的任意流
         ●UTCTime:"coordinated universal
    time"或者格林威治平均时(GMT)值。

     简单类型分为两类:string类型和non-string类型。BIT STRING,
IA5String, OCTET STRING, PrintableString, T61String, 和UTCTime是string类型。

    
考虑到编码,String类型可以视为由组件组成,组件是substring。这样即使事先不知道值的长度也可以使用结构化的、不定长的编码方式进行编码(例如,从一个file
stream中输入的octet string值)。

     String类型可以指定大小限制,以限制值的长度。
    

2.2 结构化类型(Structured types)


    
结构类型由组件组成。ASN.1定义了四种,都与PKCS标准有关:
    
    ●SEQUENCE:一个或多个类型的有序集合
         ●SEQUENCE OF:0个或某个给定类型多次出现的有序集合
        
    ●SET:一个或多个类型的无序集合
         ●SET OF:0个或某给定类型多次出现的无序集合

    
结构类型允许有可选组件。可选组件可能有默认值。
    

2.3 隐式和显式标签类型(Implicitly and explicitly tagged types)


    
在一个application中tagging对于区分类型十分有用,tagging通常也用于在一个结构类型中区分组件类型。例如,SET或SEQUENCE类型的可选组件一般都给予不同的context-specific标签以避免混淆。

    
有两种方法可以标记一个类型:隐式(implicitly)和显式(explicitly)。
隐式标签类型是在其它类型基础上通过改变其下层类型的标签生成的。隐式标签使用ASN.1关键词[class
number] IMPLICIT(见第5.1节)表示。

    
显式标签是在其它类型基础上通过在其下层类型的标签之外添加一个外层标签生成的。从效果上看,显式标签类型是包含一个组件的结构类型,该组件即下层类型。显式标签由ASN.1关键词[class number] EXPLICIT(见第5.2节)表示。

     只有关键词[class number]与使用显式标签相同,除非该“模块”的ASN.1类型默认定义为隐式标签。(“模块”属于高级特性,不在本文档描述范围内)

    
从编码的角度看,隐式标签类型可视为与下层类型相同,除非标签不同。显式标签类型可视为有一个组件的结构类型,该组件即为下层类型。隐式标签可以使编码较短,但是如果下层类型是不确定的,显式标签必须避免含糊不清(例如下层类型是CHOICE或ANY)。

    
ASN.1中的其他类型包括CHOICE和ANY类型。CHOICE类型表示一个联合体,它具有一个或多个备选项(alternative);ANY类型表示任意类型的任意值,其中任意类型可能在使用对象识别符或整数值注册中定义。

3. 基本编码规则(Basic Encoding Rules)
   ASN.1 的基本编码规则定义了一种或多种把任意 ASN.1 值表示成字节字符串的方法,
缩写为BER。 (当然还有其它的方法,但是BER是 OSI中转换这些值的标准) 使用 BER,一个 ASN.1 的值有三种编码方法,选择哪种取决于值的类型和值的长度是否已知。这三种方法是:简单定长编码,结构化定长编码,及结构化不定长编码。简单的non-string类型使用第一种(简单定长编码) ;结构化类型可使用任一种结构化的编码方法;简单的string类型根据值的长度是否已知可使用任一种方法。隐式标签定义的类型可使用下
层类型的方法,显式标签定义的类型使用结构化的编码方法。

每种BER编码方法都有三或四部分:
Identifier octets:定义了ASN.1 值的类和标签值,
指明编码方法是简单的还是结构化
的。
Length octets:对于定长编码方法,它指出了内容字节个数;对于结构化非定长编
码方法,它指明长度是不确定的。
Contents octets:对于简单定长编码方法,它给出了值的具体表示;对于结构化的
方法,它给出了值内容的BER编码的串联。
End-of-contents octets:对于结构化非定长的编码方法,它表示内容结束;对于其
它方法,没有该部分。

在下面的章节中介绍了这三种编码方法。


3.1 简单定长方法(Primitive, definite-length
method


这种方法用于简单类型及通过对简单类型使用隐式标签生成的类型。
它要求值的长度是
事先预知的。BER编码的部分定义如下:
1. Identifier octets,有两种形式:较小的标签值(标签值在0
和30之间)和较大的标
签值(标签值大于等于31)
Low-tag-number
form:一个字节。Bit8和bit7表示类(如表2),bit6值为0,表示
编码方法为简单化的。Bit5-1给出了标签值。

Class Bit 8 Bit 7
universal 0 0  
application 0 1

context-specific 1 0
private 1 1

High-tag-number
form:两个或多个octet。第一个octet形式如low-tag-number

form,但是bit5-1均为1。第二个和以后的字节给出标签值,基于128,最高位在
先,以便使用尽可能少的数字,除了最后一个字节以外,每个字节的bit
8都置为1。最后一个字节的为0。

2. Length octets: 有两种格式: 短型 (长度在0至127之间) 和长型
(长度在0至21008−1之间)
Short form: 一个字节,bit8为0,bit 7-1表示长度。
Long form:
2-127个字节。第一个字节的Bit 8为1,bit
7-1表示后面有多少个用于
表示实际长度的octet。第二个和随后的octet给出实际长度,基于256,高位数字在先。

3. Contents octets:给出了值的具体表示(如果类型是由隐式标签定义的,则给出了
下层类型的值) ,特定类型的细节详见第5节。


3.2 结构化定长方法(Constructed, definite-length
method)



结构化定长方法适用于简单的string类型、结构类型、在二者基础上通过隐式标签生成
的类型和在任何类型基础上由显式标签生成的类型。要求值的长度事先已知。BER
编码方
法各部分如下:
1. Identifier octets:与第 3.1 节介绍的一样,但bit6的值为 1,表示编码方法是结构化的。
2. Length octets:见第3.1节。
3. Contents octets,值的组件的BER编码的串联

对于简单string类型和在其基础上由隐式标签生成的类型,是值的连续子串的
BER编码的串联(隐式标签的下层值)

对于结构类型和在其基础上由隐式标签生成的类型,是值的组件的BER编码的
串联(隐式标签的下层值)

对于在任何类型基础上使用显式标签生成的类型,是下层值的BER编码
特定类型的细节见第5节。

3.3 结构化非定长方法(Constructed, indefinite-length method)


结构化的、非定长编码用于简单string类型、结构类型、在二者基础上使用隐式标签生
成的类型和在任何类型基础上使用显式标签生成的类型。不要求事先知道值的长度。BER
编码各部分如下:

Identifier octets,见第3.2节
Length octets.一个字节,值为80
Contents octets.见第 3.2节。
End-of-contents octets两个字节,为00   00。

由于end-of-contents octet通常出现在普通BER编码出现的位置 (例如, 在一个 sequence值的内容 octet 出现的位置) ,可把 00 和 00 分别视为 identifier 和 length octet。因此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节给出的规则基础上增加了如下限制:

1. 如果长度在0-127之间,必须使用短型长度表示法。
2. 如果长度大于等于 128,必须使用长型长度表示法。并且长度必须使用尽可能少的字节表示。

3. 对于简单 string类型和在其基础上使用隐式标签生成的类型,必须使用简单定长编
码方法。
4. 对于结构化类型和在其基础上使用隐式标签生成的类型、及在任何类型基础上使用
显式标签生成的类型,必须使用结构化定长编码方法。
对于特殊类型(如BIT STRING、SEQUENCE、SET 和 SET OF)的其他限制见第5 节。

5. 某些类型的符号和编码

本节给出了部分 ASN.1 类型的符号,并介绍了如何使用 BER 和 DER
对这些类型进行编码。
这里介绍的类型是第2 节提到的,按字母顺序列在下面。
每个介绍包括ASN.1 符号、BER编码和DER编码。编码的重点主要在内容字节上,标
签和长度字节遵循第3、4节的介绍。介绍还解释了每种类型用在PKCS中何处及相关的标
准。ASN.1 符号主要是针对类型的,但还是针对OBJECT IDENTIFIER给出了类型符号和值
符号。

5.1 隐式标签类型

隐式标签类型是在其他类型基础上通过改变下层类型的标签生成的类型。

隐式标签在整个 PKCS 中用于可选的 SEQUENCE 组件,其下层类型是除 ANY 以外的
任何类型。也用于PKCS #7的ExtendedCertificateOrCertificate类型的 extendedCertificate备选项。
ASN.1
表示法:
[[class] number] IMPLICIT Type
class = UNIVERSAL | APPLICATION |
PRIVATE
其中,Type 是类型,class 是可选的 class 名,number 是类内的标签值,是一个非负整数。

在默认标签方法为隐式标签的ASN.1 模块中,也可以使用[[class] number] Type 符号,
关键词 IMPLICIT 是隐含的(见第 2.3 节) 。在模块以外的地方进行定义声明,最好使用关键词IMPLICIT以避免语义含混。
如果没有 class 名称,则标签为
context-specific 类。context-specific 类
型的标签只能出现在结构类型或CHOICE类型的组件中。
例:PKCS
#8的 PrivateKeyInfo类型有一个可选的attributes组件,具有一个
隐式的、context-specific标签:

PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0]
IMPLICIT Attributes OPTIONAL }

这里,下层类型为Attributes,class是缺省的(即context-specific类),在
这个类内的标签值为0。
BER encoding:根据下层类型可以采用简单化的或结构化的编码。内容字节与下层值
的BER编码有关。


例:一个PrivateKeyInfo值的attributes组件的BER编码如下:


如果下层的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 显式标签类型


显示标签通过在一个类型的外层增加一个标签可以生成一个新的类型。
在整个 PKCS
中,显式标签用于下层类型为 ANY 的、可选的 SEQUENCE 类型组件,
及 X.509的Certificate类型的version组件。


ASN.1 表示法:
[[class] number] EXPLICIT Type
class = UNIVERSAL | APPLICATION | PRIVATE

Type 表示类型,class 是一个可选的类名,number
是一个非负整数,表示在类内的标签值。
如果没有类名,则标签为 context-specific 类。Context-specific
类标签只能出现在SEQUENCE、SET或CHOICE 类型的组件中。
在默认标签方法为显式标签的ASN.1 模块中,也可以使用 [[class] number] Type 符号,关键词EXPLICIT是隐含的(见第2.3节) 。在模块以外的地方进行定义声明,最好显式写明关键词EXPLICIT 以避免语义不清。
例: PKCS #7 中的
ContentInfo类型有一个可选的content组件, 具有一个显式的、
context-specific类的标签:
ContentInfo
::= SEQUENCE {
contentType ContentType,
content
    [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.1 模块的默认标签方法定义Certificate
类型为显式标签。

BER encoding. 结构化编码。Contents octets与下层值的BER编码有关。

例:ContentInfo 值的content
组件的BER 编码如下:
identifier octets为a0
length octets为下层ANY DEFINED BY
contentType值的BER编码长度
contents octets为下层ANY DEFINED BY contentType值的BER编码

DER encoding. 结构化编码。Contents octets与下层值的BER编码有关。

5.3 ANY

ANY类型用于表示任意类型的一个任意值,
其中任意类型可能在对象描述符的注册中定
义,或与一个整数值相关。
ANY 类型用于 PKCS #7 中的 ContentInfo 类型中特定的
content 值,或 X.509's
AlgorithmIdentifier 类型中特定算法的参数,或 X.501 中 Attribute
类型和
AttributeValueAssertion类型的属性值。Attribute类型广泛应用在PKCS #6, #7,
#8, #9 and
#10中,AttributeValueAssertion类型用于 X.501 DN 中。

ASN.1 表示法:

ANY
[DEFINED BY identifier]

这里identifier 是可选的识别符。


在ANY形式下,实际的类型是不确定的。 ANY DEFINED BY identifier 形式只能出现在SEQUENCE或
SET类型的组件中,对于这些组件identifier 定义了一些其他的组件,其类型为INTEGER或 OBJECT IDENTIFIER(或者是在这两者基础上添加标签生成的类型) 。这种形式下,实际的类型由其他组件的值决定,其他组件的值可能由对象描述符注册也可能在一个整数表里。


例:X.509的AlgorithmIdentifier类型有一个 ANY类型的组件:
AlgorithmIdentifier ::=
SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY
algorithm OPTIONAL }
这里parameter组件的实际类型由algorithm组件的值决定。
实际类型在组件的对
象描述符的注册中定义。

BER encoding. 与实际值的BER编码相同。
例: parameter 组件的
BER 编码值是实际类型值的 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 类型的 certificates 的 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. 简单或结构化的编码。在简单编码中,第一个内容字节指出了该 bit string 凑成 8 的倍数所缺少的 bit 数(这些 bit 称为无用的比特) 。第二个和随后的内容字节指出了转换成字节字符串的bit string的值。转换过程如下:

1. 在 bit string的结尾填充0 至7个任意值的比特,使整个bit string的长度是8的倍数。如果比特流的长度已经是8 的倍数,则不需要填充
2. 填充后的比特流被分成octet。前八个 bit作为第一个octet,分别为 bit8至 bit1;这样一直分割下去,直到最后8个bit组成 octet。


在结构化编码中,contents 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 constructed
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

5.5 CHOICE
CHOICE类型表示一个或多个备选项的联合体。

CHOICE 类型用于表示扩展证书 的联合体和 PKCS #7 的
ExtendedCertificateOrCertificate类型中的X.509 证书。
ASN.1 表示法:
CHOICE {

[identifier1] Type1,


这里 identifier1,……,identifiern 是可选的,不同的
identifiers 表示不同的备选项。
Type1,……,Typen 是备选项的类型。Identifiers主要是为了书面表示,并不影响类型的值
或类型的编码。

类型必须具有不同的标签值。可以在备选项上添加显式或隐式标签来满足此要求。

例: PKCS #7 的 ExtendedCertificateOrCertificate类型是一个CHOICE类型:

ExtendedCertificateOrCertificate ::= CHOICE {
certificate
Certificate, -- X.509
extendedCertificate [0] IMPLICIT ExtendedCertificate }


这里备选项的 identifiers 是 certificate 和 extendedCertificate,备选项的类型是Certificate和[0] IMPLICIT ExtendedCertificate。


BER encoding. 与被选中的选项的BER编码相同。由于备选项的标签值不同,所以可以区分出不同的BER编码。


例: 如果选择certificate选项,则BER编码的 identifier octets是 30,如果选择
的是 extendedCertificate选项则为a0。

DER encoding. 与被选中的选项的DER编码相同。

5.6 IA5String


IA5String类型表示由IA5 字符组成的任意流。IA5
代表 International Alphabet
5,与ASCII相同。该字符集包括不可打印的控制字符。一个IA5String值长度可以为任意值,
包括0。该类型属于string类型。


IA5String 类型用于 PKCS #9 的 electronic-mail address, unstructured-name, and

unstructured-address属性。

ASN.1 表示法:

IA5String

BER
encoding. 简单或结构化的编码方式。 使用简单编码方式时, 内容字节为IA5
string
格式的字符,用ASCII编码。如果使用结构化编码方式,内容字节为IA5
string格式的连续
子串的BER编码的串联。

例: 根据长度字节的形式和采用简单还是结构化编码方式,IA5String

"test1@rsa.com" 的 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" + "@" +
"rsa.com"
   16 05 74 65 73 74 31
   16 01 40
   16 07 72 73 61 2e
63 6f 6d
DER encoding. 简单化编码。Contents octets与BER编码相同。
例:
IA5String类型值"test1@rsa.com" 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,……,identifiern 是可选的不同识别符,value1,……,valuen
是可选的整数值。识别符如果出现就与类型值相关联。
例: X.509 的Version类型是一个INTEGER类型,其可识别的值为:

Version ::= INTEGER { v1988(0) }
识别符 v1988 与值 0 相关联。X.509 的 Certificate
类型使用识别符 v1988 给
version组件指定了默认值0:
Certificate ::= ...
version Version
DEFAULT v1988,
...
BER encoding. 简单编码。内容字节以2
的补码形式给出了整数值,基于256,最高位
在先,以使用最少的字节。值0 编码为一个00字节。

表3列出了一些BER编码的例子(同时也是DER编码的例子) :

Integer value BER encoding
0 02
01 00
127 02 01 7F
128 02 02 00 80
256 02 02 01 00
-128 02 01 80

-129 02 02 FF 7F
DER encoding. 简单化编码。内容字节与BER编码相同。

5.8 NULL


NULL类型表示一个null值。

在PKCS的几个地方NULL类型用于算法参数。
ASN.1 表示法:
NULL
BER encoding.
简单编码。内容字节为空。

例: 根据长度字节的形式,NULL值的BER编码可以为下列任意一种或其他:
05 00
05 81
00
DER encoding. 简单编码。内容为空。NULL值的DER编码固定为05 00。

5.9 OBJECT IDENTIFIER

OBJECT IDENTIFIER
类型表示一个对象识别符,由一列整数组件组成,用于识别一个对象,如算法、属性类型、或定义了其他对象识别符的注册机构。

一个 OBJECT IDENTIFIER值可以有任意个组件, 组件通常可以为任意非负值。 该类型是 non-string类型。
OBJECT IDENTIFIER 值由注册机构指定其含义。每个注册机构负责由一个指定序列
开始的所有组件的序列。通常,注册机构会把序列的子集委派给下属的其他注册机构,或者
指定给对象的特殊类型。通常至少有两个组件。


OBJECT IDENTIFIER类型在PKCS #7的ContentInfor类型中用于识别content,
在 X.509 的 AlgorithmIdenifier 类型中用于识别算法。在 X.501 的 Attribute
和AttributeValueAssertion类型中用于识别属性。 Attribute类型广泛用于PKCS #6,
#7, #8, #9, and #10,AttributeValueAssertion 类型用于X.501 distinguished names。
OBJECT IDENTIFIER值在整个PKCS中定义。

ASN.1 表示法:
OBJECT IDENTIFIER
OBJECT
IDENTIFIER类型值的ASN.1 符号为:
{ [identifier] component1
componenti =
identifieri | identifieri (valuei) | valuei

这里 identifier, identifier1,……,identifiern 是识别符,value1,……,valuen 是可选的整数值。

没有 identifier 的形式是由组件组成的完整的值,有 identifier 的形式使用另一个对象
识别符的值简化了开始的组件。

识别符 identifier1,……,identifiern 主要用于书写,但是当与整数值同时出现时必须对应。

只有当识别符在X.208 定义的一小部分识别符范围内时才可以省略整数值。

例: 下列值都是分配给RSA Data Security, Inc.的对象识别符:

{ iso(1) member-body(2) 840 113549 }
{ 1 2 840 113549 }
(在下面给出了ASN.1
值的符号的例子中,对象识别符的值为10进制而不是16 进制)

表 4列举了一些对象识别符的值和它们的含义。
Object
identifier value Meaning
{ 1 2 } ISO member bodies
{ 1 2 840 } US (ANSI)

{ 1 2 840 113549 } RSA Data Security, Inc.
{ 1 2 840 113549 1 } RSA Data
Security, Inc. PKCS
{ 2 5 } directory services (X.500)  
{ 2 5 8 }
directory services—algorithms
Table 4. Some object identifier values and
their meanings.

BER encoding. 简单编码。内容字节如下,其中value1,……,valuen
表示在整个对象
描述符中组件的整数值:
1. 第一个字节值为 40 ×value1 + value2. (这是唯一的,由于 value1
的值限制为0, 1,和 2;当value1 为 0或 1时value2 限制在 0至 39之间;根据
X.208,n 总是至少为2.)

2. 如果有后续的字节,编码为
value3,……,valuen。每个值基于128编码,最
高位在先以保证使用尽可能少的数字,除了最后一个字节外,每个 octet
的最高位都置为1。

例: RSA Data Security, Inc.的对象描述符的BER编码的第一个字节是40×1 + 2 = 42 = 2a16。

840的编码为6×128 + 4816 即 86 48, 113549 的编码为6⋅1282 + 7716 ⋅128 + d16 是 86 f7 0d。

最后的BER编码为:
06 06 2a 86 48 86 f7 0d
DER encoding.
简单编码。内容字节与简单的BER编码相同。

5.10 OCTET STRING


OCTET STRING 类型表示任意的字节流。一个 OCTET STRING
值可以为任意长度,包括0。该类型为string类型。
OCTET STRING类型用于PKCS #5的 PBEParmeter类型的 salt
值,也用于 PKCS #7的信息摘要、加密信息、加密信息摘要和加密内容,还用于PKCS #8 的私钥和加密私钥。
ASN.1
表示法:

OCTET STRING [SIZE ({size | size1..size2})]

这里size,
size1,和size2 是可选的尺寸限制。在OCTET STRING SIZE (size)形式下,
octet string必须包含size 个 octets。在 OCTET STRING SIZE (size1..size2) 形式下,octet
string 必须包含size1至 size2个octets。在OCTET STRING 形式下,octet string大小任意。
例: PKCS #5 的 PBEParameter类型有一个类型为OCTET STRING的组件:

PBEParameter ::= SEQUENCE {

salt OCTET STRING SIZE(8),
iterationCount INTEGER }


这里组件salt的大小总是8个字节。
BER encoding. 简单或结构化编码。如果使用简单化编码,内容字节给出了octet
string的值, 从第一个字节到最后一个。 如果使用结构化编码, 内容字节给出了OCTET STRING 值
子串的BER编码的串联。


例: 根据长度字节的形式和采用简单化编码还是结构化编码,OCTET STRING类型值
01 23 45 67 89 ab cd ef的
BER编码可以为下列任一种:
04 08 01 23 45 67 89 ab cd ef DER encoding
04 81 08 01 23
45 67 89 ab cd ef long form of length octets
24 0c constructed encoding: 01
... 67 + 89 ... ef
   04 04 01 23 45 67
   04 04 89 ab cd ef

DER
encoding. 简单化编码。Contents octets与BER编码相同。

例: OCTET STRING类型值01 23 45 67
89 ab cd ef的 DER编码为:
04 08 01 23 45 67 89 ab cd ef

5.11 PrintableString


PrintableString类型表示由可打印字符组成的任意流。可打印字符列于下列集合:
A, B,

a, b,
0, 1,
(space) ' ( ) + , - . / : = ?

该类型为string类型。

PrintableString用于PKCS #9 的challenge-password和 unstructuerd-address
属性,
也用于几个X.521 distinguished names attributes.

ASN.1 表示法:

PrintableString

BER encoding.
简单或结构化编码。如果使用简单编码,内容字节给出了用ASCII编码
的可打印字符流。如果使用结构化编码,内容字节给出了流的连续子串的BER编码的串联。

例: 根据长度字节的形式和采用哪种编码方法,可打印字符串"Test User 1"的 BER编
码可以为下列任一种:

13 0b
54 65 73 74 20 55 73 65 72 20 31 DER encoding
13 81 0b 54 65 73 74 20 55 73
65 72 20 31
long form of length octets
33 0f constructed encoding: "Test
" + "User 1"
   13 05 54 65 73 74 20
   13 06 55 73 65 72 20 31


DER encoding. 简单编码。内容字节与BER编码相同。

例: 可打印字符流"Test User 1" 的
DER编码为:
13 0b 54 65 73 74 20 55 73 65 72 20 31

5.12 SEQUENCE

SEQUENCE类型表示一个或多个类型的有序集合。

SEQUENCE类型用于整个PKCS和相关标准。

ASN.1 表示法:
SEQUENCE {
[identifier1]
Type1 [{OPTIONAL | DEFAULT value1}],
[identifiern] Typen [{OPTIONAL |
DEFAULT valuen}]}

这里 identifier1 ,……, identifiern
是可选的、针对不同组件不同的识别符,
Type1,……,Typen 是组件的类型,value1,……,valuen
是组件的可选默认值。识别符主要用于书写,并不影响类型的值或编码。

OPTIONAL
限定词表示组件的值是可选的,不一定出现在序列里。DEFAULT 限定词也
表示该值是可选的,如果未指定组件则分配一个默认值给它。


任何带有OPTIONAL或 DEFAULT限定词的组件类型,
及其后的组件都必须具有不同的标签。为了满足这一要求,最好在一些组件前加上隐式或显式的标签。

例: X.509
的Validity类型是一个带有两个组件的SEQUENCE类型:

Validity ::= SEQUENCE {
start
UTCTime,
end UTCTime }

这里组件的识别符是start和end,组件类型都是UTCTime。
BER encoding. 结构化编码。
内容字节是序列组件的BER编码按照定义的顺序的串联,
对于带有OPTIONAL和DEFAULT识别符的组件需遵守下列规则:

如果序列中带有OPTIONAL或
DEFAULT限定词的组件的值未给出, 则内容字节中
不应该包含该组件的编码。

如果带有DEFAULT限定词的组件值为默认值,则内容字节中可以包含、也可以不
包含该组件的编码。
DER encoding. 结构化编码。内容字节与 BER 编码相同,但是使用 DEFAULT 限定词
的组件的值如果是默认值,则内容字节不包含该组件的编码。


5.13 EQUENCE OF

SEQUENCE
OF类型表示某个给定类型出现0次或多次的有序集合。
SEQUENCE OF类型用于X.501 distinguished names。


ASN.1 表示法:
SEQUENCE OF Type

这里Type 即为类型。

例: X.501
的RDNSequence类型包括 0个或多个RelativeDistinguishedName
类型,意义最重大的出现在前面:


RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
BER encoding. 结构化的编码。

Contents octets是按照集合中类型值出现顺序的BER编码的串联。

DER encoding.结构化的编码。
Contents octets是按照集合中类型值出现顺序排列的DER编码的串联。

5.14
SET


SET类型表示一个或多个类型的无序集合。
SET类型在PKCS无任何应用。
ASN.1
表示法:
SET {
[identifier1] Type1 [{OPTIONAL | DEFAULT value1}],

[identifiern] Typen [{OPTIONAL | DEFAULT valuen}]}
这里
identifier1,……,identifiern 是可选的、不同的组件识别符。Type1,……, Typen

是组件的类型。value1,……,valuen 是可选的组建默认值。识别符主要用于书写,不影响
类型的值或编码。


OPTIONAL限定词表示组件的值是可选的,不一定在set中出现。DEFAULT限定词也
表示组件值是可选的,如果该组件缺省则使用默认值。


类型必须具有不同的标签。可以在一些组件前添加隐式或显式标签满足这一要求。

BER encoding.
结构化编码。Contents octets是set组件值的
BER编码的串联,可以是任意顺序的。带有OPTIONAL和DEFAULT限定词的组件需满足下列规则:

如果 set 中带有 OPTIONAL 或 DEFAULT 限定词的组件值未指定,则内容字节中不需要包含该组件的BER编码。

如果带有DEFAULT限定词的组件值为默认值,则内容字节中可以包含、也可以不包含该组件的BER编码。

DER encoding.
结构化的编码。除以下两点外,内容字节与BER编码相同:
1. 如果带有DEFAULT限定词的组件值为默认值,则不包含该组件的编码。
2. 组件是有顺序的,按照标签升序排列。

5.15 SET OF


SET OF类型表示一个给定类型出现0次或多次的无序集合。
SET OF类型用于在 PKCS #6,
#7, #8, #9 and #10中表示属性集,或信息摘要算法识别
符、签发者信息和PKCS #7 中重复信息的集合,或X.501
distinguished names。

ASN.1 表示法:
SET OF Type

这里Type 即为类型。


例: X.501 的 RelativeDistinguishedName 类型由 0 个或
多个AttributeValueAssertion类型组成,但不关心其出现的顺序:
RelativeDistinguishedName ::=

SET OF AttributeValueAssertion

BER encoding.结构化编码。内容字节是集合中出现的值的 BER
编码按任意顺序的串联。

DER encoding. 结构化编码。内容字节与BER编码相同,但是
BER编码是按照字典升序的顺序排列的。

所谓字典升序是按如下步骤进行的:在较短的 BER
编码的最后一个字节后面逻辑上填充伪字节,其值小于任何正常的字节。从左至右比较 BER
编码,直到出现差别。不同点字节值较小的那个即为较小的BER编码。

5.16 T61String


T61String 类型表示由 T.61 字符组成的任意流。T.61 是 ASCII 字符集的 8bit 扩展。
特殊的"escape"序列定义了随后字符作为其他语言(如日语)的解释。初始解释为拉丁语。
该字符集包括不可打印的控制字符。T61String类型只允许拉丁语和日语的解释,及实现
者对不支持的控制字符目录名的声明[NIST92]。一个T61String值可以为任意长度,包括
0。该类型属于string类型。


T61String类型用于PKCS #9的unstructured-address 和challenge-password
attributes,,及几个X.521 attributes。

ASN.1 表示法:
T61String


BER encoding. 简单化或结构化编码。如果使用简单化编码,内容字节为 T.61 流形式
的字符, 按ASCII编码。
如果使用结构化编码, 内容字节为T.61流子串的BER编码的串联。
例:: 根据长度字节的形式和采用哪种编码方法,T61String 类型值"clٛ s
publiques" (French for "public keys")的 BER编码可以为下列任一种:

14 0f DER
encoding
   63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
14 81 0f long
form of length octets
   63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
34
15 constructed encoding: "clٛ s" + " " + "publiques"
   14 05 63 6c c2 65 73

   14 01 20
   14 09 70 75 62 6c 69 71 75 65 73

8比特字符c2是一个T.61前缀,在下一个字符前添加一个重音符。
DER encoding. 简单化编码。内容字节同简单BER编码。

例: T61String类型值"clٛ s publiques"的DER编码为:
14 0f 63 6c c2 65 73 20 70 75
62 6c 69 71 75 65 73

5.17 UTCTime


UTCTime类型表示"coordinated universal
time"或格林威治平均时间值。一个UTCTime
值包括精确到分钟或秒的本地时间,及相对于GMT的偏移(单位为小时和分钟)
。可以采用
下列任一种形式:

YYMMDDhhmmZ
YYMMDDhhmm+hh'mm'

YYMMDDhhmm-hh'mm'
YYMMDDhhmmssZ
YYMMDDhhmmss+hh'mm'

YYMMDDhhmmss-hh'mm'

其中:
YY 是年份的末两位
MM 是月份(01 to 12)
DD
是日 (01 to 31)
hh 是小时(00 to 23)
mm 是分钟(00 to 59)
ss 是秒 (00 to 59)


Z 表示本地时间是 GMT,+ 表示本地时间落后于GMT,- 表示本地时间提前于
GMT hh' 是与GMT相差的绝对小时值

mm' 是与GMT相差的绝对分钟值
该类型为string型。
UTCTime类型用PKCS #9的signing-time
attribute的签发时间和X.509的Validity 类
型的证书有效期。

ASN.1 表示法:
UTCTime


BER encoding. 简单化或结构化编码。如果使用简单化编码,内容字节以流的形式给出
字符,按
ASCII编码。如果使用结构化编码,内容字节为流的子串的BER编码的串联。 (一
般不使用结构化编码,因为UTCTime值都很短,但是允许使用结构化编码。


例: 写本句的时间为4:45:40 p.m. Pacific Daylight Time on May 6,
1991,可以表示成下列任
一种形式:
"910506164540-0700"
"910506234540Z"


其BER编码可以为:
17 0d 39 31 30 35 30 36 32 33 34 35 34 30 5a
17 11 39
31 30 35 30 36 31 36 34 35 34 30 2D 30 37 30
      30

DER encoding.
简单编码。内容字节与BER简单编码同。

/Files/alasika/国标文档.rar

posted @ 2011-06-03 11:27  泠澄雯霁  阅读(7418)  评论(0编辑  收藏  举报