java实现asn.1解码_ASN1编解码实现方法

第1章概述

1.1背景

系统与充值平台的接口是文件的方式,充值平台将文件内容以ASN.1方式进行编码,系统需要根据ASN.1协议进行解码。

关于ASN.1开发的资料,网上资料非常少,特别是涉及到具体的语言,如java,资料、案例及第三方库更是少之又少。从无到有是很困难的,为了防止后期其他系统还需要做类似接口,将其记录为文章以便后查,文章会以充值接口作为案例进行介绍。

1.2ASN.1概念

在和领域,ASN.1(Abstract Syntax Notation one) 是一套,是描述的表示、编码、传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。

ASN.1包括几个标准化编码规则,如基本编码规则(BER)-X.209、规范编码规则(CER)、识别名编码规则(DER)、压缩编码规则(PER)和XML编码规则(XER)。这些编码规则描述了如何对ASN.1中定义的数值进行编码,以便用于传输,而不管计算机、编程语言或它在应用程序中如何表示等因素。ASN.1的编码方法比许多与之相竞争的标记系统更先进,它支持可扩展信息快速可靠的传输—在无线宽带中,这是一种优势。1984年,ASN.1就已经成为了一种国际标准,它的编码规则已经成熟并在可靠性和兼容性方面拥有更丰富的历程。

简洁的二进制编码规则(BER、CER、DER、PER,但不包括XER)可当作更现代XML的替代。然而,ASN.1支持对数据的语义进行描述,所以它是比XML更为高级的语言。

ASN.1 的描述可以容易地被映射成C或C++或Java的数据结构,并可以被应用程序代码使用,并得到运行时程序库的支持,进而能够对编码和解码XML或TLV格式的,或一种非常紧凑的压缩编码格式的描述。同时,ASN.1也是一种用于描述结构化实体的结构和内容的语言。

如:使用ASN.1语法可以这样定义一个类:Report ::= SEQUENCE {

author OCTET STRING,

title OCTET STRING,

body OCTET STRING,

biblioINTEGER

}

注:在进行ASN1开发前,需要先阅读上述文章,了解其中的一些基本概念。

1.3TAG

由于TAG在ASN1中非常之重要,而且在对文件进行解析时就是因为TAG的问题导致浪费了很多时间,因此这里对其单独介绍,不过只是提出概念,详细描述还需参见相关规范。

TAG是对ASN1协议中每个数据域的标识,通过2.2的截图可以看到,每个结点名称后面都有一个数字,这个就TAG值。TAG有可分为四大类:UNIVERSAL、Context、Private、Application。详见:

第2章开发工具

通常情况下,如果使用该协议进行交互,双方应该规定出一个以ASN.1语法描述的协议文件,类似webservice开发中的wsdl,然后各自系统使用相关工具进行编解码。

2.1开发库

目前网上能查到的第三方免费工具,主要有JavaAsn1Comiler和bouncycastle子库:

lJavaAsn1Comiler(JAC.jar):

n该工具可根据ASN.1协议描述文件,生成对应的java类,同时提供的API接口非常友好,命名概念同理论基本一致,使用非常方便,但是前提是必须要有完整的ASN.1描述文件,而且非常重要的一点使用限制是,该库目前支持TAG值在0-127之间,即:如果协议中的数据使用了超过127的TAG值,则该库无法支持,不可使用(否则会出现编码错误,无法解析)。

n该库提供了相当丰富的使用案例,可参考其工程下的test目录。

lbouncycastle(bcprov-jdk16-1.46.jar)

n该工具没有提供自动生成java代码的能力,如果要进行编解码,则需要手动对协议中的类进行定义,并且自己调用相应的API实现编解码。使用起来较JAC复杂,但是该库对TAG值没有限制,适合用在TAG值大于127的场景。

n在使用该类进行解析时,由于没有提供方便的API进行自动解析,因此需要手工编写解析代码,比较郁闷的是其帮助文档也没有比较详细的案例,最后的解码操作还是通过阅读其ASN1Dump类的实现方才完成。

2.2辅助工具

由于经ASN.1编码后的文件是二进制格式,无法直接阅读,因此在开发过程中,为了能够比较直观的阅读到其编码后的

你可能感兴趣的:(java实现asn.1解码)