第十三章 NSA1库 / 13.1 ASN1简介

       ASN.1(Abstract Syntax Notation OneX.208),是一套灵活的标记语言,它允许定义多种数据类型,从integerbit string 一类的简单类型到结构化类型,如set sequence,并且可以使用这些类型构建复杂类型。

       DER编码是ANS.1定义的将对象描述数据编码成八位串值的编码规则,它给出了对ANS.1值(对象的类型和值)的唯一编码规则。

       ANS.1中,一个类型是一组值,对于某些类型,值的个数是已知的,而有些类型中值的个数是不固定的。ANS.1中有四种类型:

       1)    简单类型

                     BIT STRING  任意01位串;

                     IA5String      任意IA5(ASCII)字符串;

                     INTEGER   任意一个整数;

                     NULL      空值;

                     OBJECT IDENTIFIER 一个对象标识号(一串整数),标识算法或属性类型等对象;

                     OCTET STRING 8位串;

                     PrintableString       任意可打印字符串;

                     T61String       任意T.618位)字符串;

                     UTCTime       一个“协同世界时”或“格林威治标准时(G.M.T)”。

2)    结构类型

                     结构类型由组件组成,ANS.1定义了四种结构类型:

                     SEQUENCE                  一个或多个类型的有序排列;

                     SEQUENCE OF            一个给定类型的0个或多个有序排列;

                     SET                             一个或多个类型的无序集合;

                     SET OF                     一个给定类型的0个或多个无序集合。

       3)    带标记类型

在一个应用内部区分类型的有效方法是使用标记,标记也同样用于区分一个结构类型内部不同的组件。例如SETSEQUENCE类型可选项通常使用上下文标记以避免混淆。有两种标记类型的方法:隐式和显式。隐式标记类型是将其它类型的标记改变,得到新的类型。隐式标记的关键字是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