密碼學 - 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) 標準的一部分。image 1

在 ASN.1 標準中,定義了多種編碼規則,包括 BER (Basic Encoding Rules)、DER (Distinguished Encoding Rules) 和 PER (Packed
Encoding Rules)等。
其中,DER 是由國際電信聯盟(ITU) 在1988年制定的一種更嚴格的 BER 子集,具有以下優點:

  1. 唯一性:對於相同的資料,DER 保證產生唯一的二進位編碼,這對於數位簽章和憑證等安全應用至關重要。

  2. 緊湊性:DER 透過最佳化編碼規則,盡可能減少編碼後的資料長度,節省傳輸和儲存開銷。

  3. 跨平台:DER 與硬體和作業系統無關,可在任何平台上實作並進行傳輸和解析。

  4. 高效率: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)。

ClassBit 8Bit 7
Universal00
Application01
Context-specific10
Private11

整體而言,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 指的就是實際的資料內容,根據不同類型有不同編碼方式,這邊舉幾個常見的類型:

TypeClassConstructedTag numberTag encoding
BOOLEANUniversalPrimitive10x01
INTEGERUniversalPrimitive20x02
BIT STRINGUniversalPrimitive30x03
OCTET STRINGUniversalPrimitive40x04
NULLUniversalPrimitive50x05
OBJECT IDENTIFIERUniversalPrimitive60x06
SEQUENCEUniversalConstructed160x30
SETUniversalConstructed170x31
UTC TIMEUniversalPrimitive230x17

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 編碼和解碼,以確保安全性和正確性。

參考資料

  1. ASN.1 - Wikipedia
  2. Type–length–value - Wikipedia
  3. X.690 - ITU-T Recommendation
  4. ITU-T X.690

也許你也會想看看