複製鏈接
請複製以下鏈接發送給好友

DER

(編碼方法)

鎖定
DER(Distinguished Encoding Rules,可辨別編碼規則)(distributed energy resource,分佈式能源)
中文名
可辨別編碼規則
外文名
DER
所屬分類
計算機術語

DER內容簡介

DER(Distinguished Encoding Rules,可辨別編碼規則)
ASN.1對象的編碼是ASN.1標準的重要部分,通常採用的是BER,而DER則是其一個子集。本文將對該編碼方法作簡單的介紹。
一個標準的ASN.1編碼對象有四個域:對象標識域、數據長度域、數據域以及結束標誌(可選,在長度不可知情況下需要,openssl中沒有該標誌)。

DER對象標識域

對象標識域有兩種形式,低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,採用高位優先,經可能少的數字原則。

DER數據長度域

數據長度域也有兩種形式,短形式和長形式。
短形式的數據長度域只有一個字節,第8位為0,其它低7位給出數據長度。
長形式的數據長度域有2到127個字節。第一個字節的第8位為1,其它低7位給出後面該域使用的字節的數量,從該域第二個字節開始給出數據的長度,基於256,高位優先。

DER數據域

數據域給出了具體的數據值。該域的編碼對不同的數據類型不一樣,這裏就不在一一詳述了,有興趣的可以參看參考資料。

DER例子

下面是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,其中,第一個字節是對象標識域,第二個字節是數據長度域,其他為數據域。