ASN.1格式数据编解码总结

    前面写了两篇博客,分别介绍了Java语言如何对asn.1格式数据编解码,都是很基础的,尤其是编码规则也是ber,就是basic encoding rules,所以普通的工具或者语言涉及到asn.1的编解码,很多都能实现,包括javascript都能做到ber的编解码。今天需要对asn.1格式数据做一个总结。

    ASN.1是Abstract Syntax Notation One的简称,就是抽象语法表示法。我们通常所见的一些工具包括asnview,nodejs的依赖asn1都只是对ber编码起作用。

    ASN.1编解码分为以下几种规则:

  •      Basic Encoding Rules 基本编码规则
  •      Canonical Encoding Rules 规范编码规则
  •      Distinguished Encoding Rules  识别名编码规则
  •      Packed Encoding Rules 压缩编码规则
  •      XML Encoding Rules XML编码规则

     对于ber编解码规则,连nodejs都有实现的asn1依赖库。而且有个网站:https://lapo.it/asn1js/,他好像能在线解码ber编码,好像无法解析uper编码。BER采用了最基本的TLV三元组结构对抽象数据进行编解码操作,规则过于简单,编码后的数据开销过大。ber因为太基础,而且编码的效果不是很好,所以一般不会在实际中使用。

    CER和DER两种编码规则均在BER的基础上增加了一定的约束发展而来。他们的区别在于:CER使用不定长编码格式,满足了传输大量数据的需要,能够保证在所有数据没有到达的时候就开始编解码的工作;DER使用了定长编码格式为可靠数据的传输而设计,主要用于对安全性要求比较高的应用程序。

     值得一提的是,我们通常见到最多的der编码规则的就是各种网站的证书certification。

    

     而我们在数据传输类协议中,通常使用PER编码,他采用了有效算法,缩短了编解码的时间。与BER规则相比,PER编码后数据占用空间能够获得40%-50%的改进,因此被广泛使用于VoIP、视频电话、多媒体以及移动通信系统等高速数据传输领域。

    前面写了一篇博客是在java语言中通过bouncycastle提供的asn编解码依赖,只能对BER规则进行编解码。如果是UPER规则,那么就需要asnlab的支持了,他提供了一套支持c,c++,java等多种语言,多种编解码方式的asn1解决方案。但是如果从asn文件生成java类或者c类需要证书,免费证书可以试用一个月。而运行时环境asnrt可以在该网站下载。

    如下所示,我的asn1插件可以设置几种编解码方法,一般应用,选择一个就够了:

    

    生成的java类如下所示:

     

     这里编解码,会多出一个参数,按照要求,如果是UPER解码,我们这里就是调用per_decode(false,in);截图看的不是很清楚,把代码粘出来:  

public static Student per_decode(boolean align, InputStream in) throws IOException {
		return (Student)TYPE.decode(in, align? 
            EncodingRules.ALIGNED_PACKED_ENCODING_RULES:
            EncodingRules.UNALIGNED_PACKED_ENCODING_RULES, 
        CONV);
}

    这里的编码规则有aligned_packed_encoding_rules与unaligned_packed_encoding_rules两种,我们根据需要传入(false,in)就可以进行对应的UPER解码了。 

    另外,推荐一个比较全面的在线编译asn文件以及对各种编码规则进行编解码的网站:https://asn1.io/asn1playground/,可以在线编译asn文件,然后根据设置的值进行编码,也可以根据编码结果进行解码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章