內容簡介
DER(Distinguished Encoding Rules,可辨別編碼規則)
ASN.1對象的編碼是ASN.1標準的重要部分,通常採用的是BER,而DER則是其一個子集。本文將對該編碼方法作簡單的介紹。
一個標準的ASN.1編碼對象有四個域:對象標識域、數據長度域、數據域以及結束標誌(可選,在長度不可知情況下需要,openssl中沒有該標誌)。
對象標識域
對象標識域有兩種形式,低Tag數字(Tag值在0到30)和高Tag數字(Tag值大於30)形式。
低Tag數字形式只有一個位元組,包含三部分,從低位為1開始編號,8和7位是Tag類型,共有四種,分別是universal(0 0)、application(0 1)、context-specific(1 0)和private(1 1);第6位是0,表明編碼類型是基本類型,第5-1位是Tag值。
高Tag數字形式可以有兩個或多個位元組,第一個位元組跟低Tag數字形式一樣,但低5位值全為1,而在後續的第二個和其後的位元組中給出Tag值,這些位元組都只使用了低7位為數據位,最高位都設為0,但最後一個位元組的最高位設為1,採用高位優先,經可能少的數字原則。
數據長度域
數據長度域也有兩種形式,短形式和長形式。
短形式的數據長度域只有一個位元組,第8位為0,其它低7位給出數據長度。
長形式的數據長度域有2到127個位元組。第一個位元組的第8位為1,其它低7位給出後面該域使用的位元組的數量,從該域第二個位元組開始給出數據的長度,基於256,高位優先。
數據域
數據域給出了具體的數據值。該域的編碼對不同的數據類型不一樣,這裡就不在一一詳述了,有興趣的可以參看參考資料。
例子
下面是SSLDocument給出的對一個對象進行DER編碼的例子,更多的例子可以參看本文給出的參考資料。
例子使用的對象是ASN.1定義的BIT STRING類型的對象,其編碼的步驟如下:
1.對位串使用"0"進行填補,使其長度為8的整數倍(如果已經是整數倍,則不需要進行填補);
2.計算填補的位數並寫下來,成為數據內容的第一個位元組;
3.寫入填補後的位串,高位位元組優先。這些數據跟前面的一個位元組組成數據內容的全部位元組;
4.在這些數據前面加上一個頭位元組,這個位元組定義如下(編號是從低位為1開始):
第8、7位:00(universal類型)
第 6 位 :0(表明是基本類型,有限長度的編碼)
第5-1位:0x03(表明是BIT STRING)
這個位元組定義了對象標識域;
5.然後在對象標識域位元組和數據位元組之間加入下面計算的定義的位元組:
計算有多少位元組的數據內容(對象標識域數據除外),如果少於127位元組,那么就定義一個位元組如下:
第8位:0
第7-1位:數據內容的位元組數量
如果數據內容的位元組數量大於127,就需要定義兩個或多個位元組,其中,第一個位元組的定義如下:
第8位:1
第7-1位:該域後面還有多少位元組
其後的位元組是數據內容的位元組數量,每位元組基於256,高位優先
下面是一個實際的數據例子:
位串:'01000100111011'
1.補齊兩個0在後面,成為8的整數倍,得到'0100010011101100';
2.'02'作為第一個數據內容的位元組;
3.'44 ec'作為其餘的數據內容的位元組;
4.'03'作為前面的對象標識位元組;
5.因為BIT STRING的tag值3<=127,所以只有一個位元組的長度域'03';
那么得到的這個位串的DER編碼就是03 03 02 44 ec,其中,第一個位元組是對象標識域,第二個位元組是數據長度域,其他為數據域。