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文件,然後根據設置的值進行編碼,也可以根據編碼結果進行解碼。

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