ASN.1(Abstract Syntax Notation One,X.208),是一套灵活的标记语言,它允许定义多种数据类型,从integer、bit string 一类的简单类型到结构化类型,如set 和sequence,并且可以使用这些类型构建复杂类型。
DER编码是ANS.1定义的将对象描述数据编码成八位串值的编码规则,它给出了对ANS.1值(对象的类型和值)的唯一编码规则。
在ANS.1中,一个类型是一组值,对于某些类型,值的个数是已知的,而有些类型中值的个数是不固定的。ANS.1中有四种类型:
1) 简单类型
BIT STRING 任意0、1位串;
IA5String 任意IA5(ASCII)字符串;
INTEGER 任意一个整数;
NULL 空值;
OBJECT IDENTIFIER 一个对象标识号(一串整数),标识算法或属性类型等对象;
OCTET STRING 8位串;
PrintableString 任意可打印字符串;
T61String 任意T.61(8位)字符串;
UTCTime 一个“协同世界时”或“格林威治标准时(G.M.T)”。
2) 结构类型
结构类型由组件组成,ANS.1定义了四种结构类型:
SEQUENCE 一个或多个类型的有序排列;
SEQUENCE OF 一个给定类型的0个或多个有序排列;
SET 一个或多个类型的无序集合;
SET OF 一个给定类型的0个或多个无序集合。
3) 带标记类型
在一个应用内部区分类型的有效方法是使用标记,标记也同样用于区分一个结构类型内部不同的组件。例如SET或SEQUENCE类型可选项通常使用上下文标记以避免混淆。有两种标记类型的方法:隐式和显式。隐式标记类型是将其它类型的标记改变,得到新的类型。隐式标记的关键字是IMPLICIT。显式标记类型是将其它类型加上一个外部标记,得到新的类型。显式标记的关键字是EXPLICIT。
为了进行编码,隐式标记类型除了标记不同以外,可以视为与其基础类型相同。显式标记类型可以视为只有一个组件的结构类型。
4) 其它类型
类型和值用符号::=表示,符号左边的是名字,右边是类型和值。名字又可以用于定义其它的类型和值。
除了CHOICE类型、ANY类型以外,所有ANS.1类型都有一个标记,标记由一个类和一个非负的标记码组成,当且仅当标记码相同时,ANS.1类型是相同的。也就是说,影响其抽象意义的不是ANS.1类型的名字,而是其标记。
通用标记在X.208中定义,并给出相应的通用标记码。其它的标记类型分别在很多地方定义,可以通过隐式和显式标记获得。
下表列出了一些通用类型及其标记:
类型 标记码(十六进制)
INTEGER 02
BIT STRING 03
OCTET STRING 04
NULL 05
OBJECT IDENTIFIER 06
SEQUENCE and SEQUENCEOF 10
SET and SET OF 11
PrintableString 13
T61String 14
IA5String 16
UTCTime 17