没有合适的资源?快使用搜索试试~ 我知道了~
ASN.1编码方式概要介绍
需积分: 0 0 下载量 197 浏览量
2023-07-18
05:31:53
上传
评论
收藏 42KB DOCX 举报
温馨提示
试读
25页
ASN.1编码方式概要介绍
资源推荐
资源详情
资源评论
原文链接:
http://hi.baidu.com/ling1026/blog/item/c93972af17039ef3fbed5034.html
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. 抽象语法标记(ASN.1)
抽象语法标记(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:对于定长编码方法,它指出了内容字节个数;对于结构化非定长编
码方法,它指明长度是不确定的。
剩余24页未读,继续阅读
资源评论
ccneu
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功