ASN.1/BER/DER编码子集入门指南(一)
ASN.1/BER/DER编码子集入门指南(一)
RSA实验室技术笔记
作者:Burton S.Kaliski Jr.
最终修订日期:Nov 1,1993
翻译:David(David@javaresearch.org),2002年6月
摘要:本笔记提供了关于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] 宽体斜体表示一个变量
[ ] 方括号表示一个条款是可选的
{ } 大括号表示相关条款
| 竖条表示可以在一组值中任选
... 省略号表示多次重复
= 等号表示条目由一些子条目来表达。
(未完待续)
补充:软件开发 , Java ,