密碼學 - ASN.1 DER Length Decoding
在密碼學中,ASN.1 (Abstract Syntax Notation One) 是一種用於描述資料結構的標準語法。它廣泛應用於電信、金融、醫療等領域,尤其是在安全協定如SSL/TLS、數位憑證等方面。
ASN.1 定義了多種編碼規則,用於將抽象的資料類型轉換為具體的二進位格式,以便在網路中傳輸或儲存,這個過程稱為序列化。
例如:BER (Basic Encoding Rules)、CER (Canonical Encoding Rules) 和 DER (Distinguished Encoding Rules) 等。
其中,DER (Distinguished Encoding Rules) 在資訊安全領域中被廣泛使用,它是一種更嚴格的 BER 子集,具有唯一性、緊湊性和跨平台等優點。
並可用作描述數位憑證、SSL/TLS 協定、PKCS 標準等安全協定和應用。
本文將介紹 ASN.1 DER 的基本概念、結構和應用,幫助你更好地理解這一重要的編碼規則。
為什麼要使用 DER?
在早期的網路通訊中,不同的系統和應用程式常常使用各自的資料格式和編碼方式,導致互通性和相容性問題。為了解決這個問題,需要一種標準化的資料表示方法,而
ASN.1 就是在這樣的背景下誕生的。
ASN.1 最初由國際電信聯盟(ITU)在 1984 年制定,作為描述電信系統之間傳輸資料的標準語法。
隨後,ASN.1 被國際標準化組織(ISO) 採用,成為了 ISO 8824 (X.680) 和 ISO 8825 (X.690) 標準的一部分。
在 ASN.1 標準中,定義了多種編碼規則,包括 BER (Basic Encoding Rules)、DER (Distinguished Encoding Rules) 和 PER (Packed
Encoding Rules)等。
其中,DER 是由國際電信聯盟(ITU) 在1988年制定的一種更嚴格的 BER 子集,具有以下優點:
唯一性:對於相同的資料,DER 保證產生唯一的二進位編碼,這對於數位簽章和憑證等安全應用至關重要。
緊湊性:DER 透過最佳化編碼規則,盡可能減少編碼後的資料長度,節省傳輸和儲存開銷。
跨平台:DER 與硬體和作業系統無關,可在任何平台上實作並進行傳輸和解析。
高效率:DER 可以快速解碼特定欄位,這對於處理大型資料結構和實現高效率的編碼解碼非常重要。
在當時的網路環境下,使用 ASN.1 DER 能夠提高系統之間的互通性,減少資料傳輸的開銷,並為安全通訊提供支援。
也因為如此 DER 被用來描述數位憑證、SSL/TLS 協定、PKCS 標準等安全協定和應用。
成為了密碼學和安全協定中不可或缺的一部分。
DER 的基本組成
接下來,我們將介紹 DER 的基本組成,包括識別位元組、長度位元組和值位元組三個部分的編碼方式。
在 DER 中,每個資料項目都由三個部分組成,即 TLV (Type-Length-Value) 結構:
識別位元組 (Identifier octets)
ID 是一個識別符,用來標識 Value 的類型。而 ID 可以分成 4 種不同的類型,這可以用前 2 bits 來編碼,再用第 6 個 bit 將 tag 分成 Primitive(0) 或 Constructed(1)。
Class | Bit 8 | Bit 7 |
---|---|---|
Universal | 0 | 0 |
Application | 0 | 1 |
Context-specific | 1 | 0 |
Private | 1 | 1 |
整體而言,ID 的結構如下:1
2
3
4
5+---+---+---+---+---+---+---+---+
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
+---+---+---+---+---+---+---+---+
| Class |P/C| Tag |
+---+---+---+---+---+---+---+---+
其中,Class 佔用前兩位,P/C(Primitive/Constructed)佔用第三位,剩餘五位用於表示 Tag。
長度位元組 (Length octets)
Length octets 用來表示 Value 的長度,而根據定義有不同的編碼方式:
短格式 (Short form)
如果長度小於 128 個位元組,則使用短格式,即長度的第一個位元組的最高位為 0,其餘 7 位可以直接視為是長度的值。
換句話說,Length octets 佔用 1 個位元組,其值就是長度的值。
例如,如果 Value 的長度是 10 個位元組,則 Length octets 的值就是 0x0A
。
長格式 (Long form)
如果長度大於等於 128 個位元組,則使用長格式,即長度的第一個位元組的最高位為 1,其餘 7 位表示後續的位元組數量。
值得注意的是,後續 LLen 個位元組是以 big-endian 的方式來表示。
例如:如果 Value 的長度為 0x0123
(十進位 291),則 Length octets 為 0x82 0x01 0x23
。
其中 0x82
的最高位為 1,表示使用長格式,剩餘 7 位(82 的二進位表示為 1000 0010
)表示後續有 2 個位元組,而 0x01 0x23
就是長度的實際值 291。
需要注意的是,在 DER 中,對於長格式,要求使用最少的位元組數來編碼長度值。也就是說,不能使用 0x82 0x00 0x80
來編碼長度
128,因為它可以使用更短的 0x81 0x80
。
如此一來,在解碼 DER 資料時,我們需要根據 Length octets 的第一個位元組來判斷使用短格式還是長格式,並據此讀取後續的長度位元組,得到實際的
Value 長度。
值位元組 (Value octets)
Value octets 指的就是實際的資料內容,根據不同類型有不同編碼方式,這邊舉幾個常見的類型:
Type | Class | Constructed | Tag number | Tag encoding |
---|---|---|---|---|
BOOLEAN | Universal | Primitive | 1 | 0x01 |
INTEGER | Universal | Primitive | 2 | 0x02 |
BIT STRING | Universal | Primitive | 3 | 0x03 |
OCTET STRING | Universal | Primitive | 4 | 0x04 |
NULL | Universal | Primitive | 5 | 0x05 |
OBJECT IDENTIFIER | Universal | Primitive | 6 | 0x06 |
SEQUENCE | Universal | Constructed | 16 | 0x30 |
SET | Universal | Constructed | 17 | 0x31 |
UTC TIME | Universal | Primitive | 23 | 0x17 |
DER 編碼實際案例
讓我們通過一個具體的例子來深入理解 DER 編碼的過程。
假設我們要對整數 42
進行 DER 編碼,我們需要按照 TLV 的結構,依次確定類型(Type)、長度(Length)和值(Value)。
確定類型
在 DER 編碼中,每種資料類型都有對應的 Tag number,可以參考前面給出的表格。對於整數類型,其 Tag number 為 2
,屬於 Universal 類,Primitive 編碼。
根據 ID 的結構,我們需要將類型、Primitive/Constructed 和 Tag number 編碼到一個位元組中:
- Class 為 Universal,對應的二進位為
00
- Primitive 編碼,對應的二進位為
0
- Tag number 為
2
,對應的二進位為00010
將這些二進位拼接起來,得到 0000 0010
,轉換為十六進位即為 0x02
。
因此整數類型的 ID 值為 0x02
。
計算長度
接下來,我們需要計算整數 42
的二進位表示所佔用的位元組數,作為 Length octets 的值。
將 42
轉換為二進位,得到 0010 1010
。為了表示一個整數,我們需要使用其最短的二進位表示,去除前導的 0
。
因此,42
的最短二進位表示為 010 1010
,恰好佔用 1 個位元組。
由於長度小於 128,我們使用短格式進行編碼。短格式下,Length octets 只佔用一個位元組,其值即為實際長度。
所以我們得到了,整數 42
的 Length octets 值為 0x01
。
確定值
最後,我們需要將整數 42
的二進位值作為 Value octets。
在上一步中,我們已經得到 42
的最短二進位表示為 010 1010
。將其補齊為一個完整的位元組 0010 1010
,轉換為十六進位,得到 0x2A
。
因此,整數 42
的 Value octets 為 0x2A
。
組裝 TLV
將上述三個部分組合起來,我們就得到了整數 42
的完整 DER 編碼:
- Type:
0x02
- Length:
0x01
- Value:
0x2A
按照 TLV 的順序,將這三個部分拼接起來,得到 0x02 0x01 0x2A
,即為整數 42
的 DER 編碼結果。
透過這個例子,對一個簡單的整數值進行 DER 編碼,包括類型的確定、長度的計算和值的表示。在實際應用中,我們可以按照相同的原理,對其他類型的資料進行編碼。
結論
ASN.1 DER 在密碼學和安全協定中扮演著重要的角色。透過將抽象的資料類型轉換為標準化的二進位格式,DER 使得資料能夠在不同的系統和網路中高效地傳輸和儲存。
本文詳細介紹了 DER 的基本概念和結構,包括識別位元組、長度位元組和值位元組三個部分的編碼方式。透過理解這些概念,我們能夠更好地設計和實作基於 ASN.1 的安全協定和應用。
值得注意的是,儘管 DER 被廣泛使用,但它並非完美無缺。例如,如果解碼器沒有正確處理某些惡意的輸入(如異常的長度值),可能會導致緩衝區溢位等安全問題。
因此在實際應用中,開發者應當使用經過充分測試和驗證的函式庫來處理 DER 編碼和解碼,以確保安全性和正確性。