天天看點

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。

ASN.1格式資料編解碼總結

     而我們在資料傳輸類協定中,通常使用PER編碼,他采用了有效算法,縮短了編解碼的時間。與BER規則相比,PER編碼後資料占用空間能夠獲得40%-50%的改進,是以被廣泛使用于VoIP、視訊電話、多媒體以及移動通信系統等高速資料傳輸領域。

    前面寫了一篇部落格是在java語言中通過bouncycastle提供的asn編解碼依賴,隻能對BER規則進行編解碼。如果是UPER規則,那麼就需要asnlab的支援了,他提供了一套支援c,c++,java等多種語言,多種編解碼方式的asn1解決方案。但是如果從asn檔案生成java類或者c類需要證書,免費證書可以試用一個月。而運作時環境asnrt可以在該網站下載下傳。

    如下所示,我的asn1插件可以設定幾種編解碼方法,一般應用,選擇一個就夠了:

ASN.1格式資料編解碼總結

    生成的java類如下所示:

ASN.1格式資料編解碼總結

     這裡編解碼,會多出一個參數,按照要求,如果是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檔案,然後根據設定的值進行編碼,也可以根據編碼結果進行解碼。