

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS Encryption SDK 訊息格式參考
<a name="message-format"></a>


|  | 
| --- |
|  本頁面上提供的參考可讓您建置自己的並與 AWS Encryption SDK相容的加密儲存庫。如果您不是自己建置相容的加密儲存庫，可能不需要此資訊。 若要在其中一個支援的程式設計語言 AWS Encryption SDK 中使用 ，請參閱 [程式設計語言](programming-languages.md)。 如需定義適當 AWS Encryption SDK 實作元素的規格，請參閱 GitHub 中的[AWS Encryption SDK 規格](https://github.com/awslabs/aws-encryption-sdk-specification/)。  | 

中的加密操作會 AWS Encryption SDK 傳回單一資料結構或[加密訊息](concepts.md#message)，其中包含加密的資料 （加密文字） 和所有加密的資料金鑰。您需要了解訊息格式，才能掌握此資料結構，或建置可加以讀寫的程式庫。

訊息格式包含兩個部分：*標題*與*本文*。在某些情況下，訊息格式還會包含第三個部分，也就是*頁尾*。訊息格式會定義網路位元組順序中的有序序列，又稱為 Big Endian 格式。訊息格式會以標題做為開頭，然後依序接著本文與頁尾 (如果有)。

支援的[演算法套件](algorithms-reference.md) AWS Encryption SDK 使用兩種訊息格式版本之一。沒有[金鑰承諾](concepts.md#key-commitment)的演算法套件使用訊息格式第 1 版。具有金鑰承諾的演算法套件使用訊息格式第 2 版。

**Topics**
+ [標題結構](#header-structure)
+ [本文結構](#body-structure)
+ [頁尾結構](#footer-structure)

## 標題結構
<a name="header-structure"></a>

訊息標題會包含加密的資料金鑰，以及說明訊息標題組成方式的資訊。下表說明訊息格式版本 1 和 2 中形成 標頭的欄位。位元組依顯示順序附加。

**不存在**值表示該訊息格式版本中不存在 欄位。**粗體文字**表示每個版本中不同的值。

**注意**  
您可能需要水平或垂直捲動，才能查看此資料表中的所有資料。


**標題結構**  

| 欄位 | 訊息格式第 1 版長度 (位元組) | 訊息格式第 2 版長度 (位元組) | 
| --- | --- | --- | 
| [Version](#header-version) | 1 | 1 | 
| [Type](#header-type) | 1 | 不存在 | 
| [Algorithm ID](#header-algorithm-id) | 2 | 2 | 
| [Message ID](#header-message-id) | 16 | 32 | 
| [AAD Length](#header-aad-length) | 2當[加密內容](concepts.md#encryption-context)為空時，2 位元組 AAD 長度欄位的值為 0。 | 2當[加密內容](concepts.md#encryption-context)為空時，2 位元組 AAD 長度欄位的值為 0。 | 
| [AAD](#header-aad) | 變數. 此欄位的長度會出現在前 2 個位元組中 (AAD 長度欄位）。 當[加密內容](concepts.md#encryption-context)為空白時，標題中不會有 AAD 欄位。 |  變數. 此欄位的長度會出現在前 2 個位元組中 (AAD 長度欄位）。 當[加密內容](concepts.md#encryption-context)為空白時，標題中不會有 AAD 欄位。  | 
| [Encrypted Data Key Count](#header-data-key-count) | 2 | 2 | 
| [Encrypted Data Key(s)](#header-data-keys) | 變數. 取決於加密資料金鑰的數量與每個加密資料金鑰的長度。 | 變數. 取決於加密資料金鑰的數量與每個加密資料金鑰的長度。 | 
| [Content Type](#header-content-type) | 1 | 1 | 
| [Reserved](#header-reserved) | 4 | 不存在 | 
| [IV Length](#header-iv-length) | 1 | 不存在 | 
| [Frame Length](#header-frame-length) | 4 | 4 | 
| [Algorithm Suite Data](#algorithm-suite-data) | 不存在 | 變數。取決於用來產生訊息的[演算法](algorithms-reference.md)。 | 
| [Header Authentication](#header-authentication) | 變數. 取決於用來產生訊息的[演算法](algorithms-reference.md)。 | 變數. 取決於用來產生訊息的[演算法](algorithms-reference.md)。 | 

**版本**  
此本訊息格式的版本。版本是 1 或 2 編碼為位元組`01`或以`02`十六進位表示法

**類型**  
此本訊息格式的類型。類型會指出結構的種類。所支援的唯一類型會如*客戶驗證的加密資料*所述。其類型值為 128，並在十六進位表示法中編碼為 `80`。  
此欄位不存在於訊息格式第 2 版中。

**演算法 ID**  
所使用演算法的識別碼。它會以 2 位元組數值表示，並解譯為 16 位元的無符號整數。如需演算法的詳細資訊，請參閱[AWS Encryption SDK 演算法參考](algorithms-reference.md)。

**訊息 ID**  
隨機產生的值，可識別訊息。訊息 ID：  
+ 唯一識別加密訊息。
+ 以弱式繫結方式，將訊息標題繫結至訊息本文。
+ 提供安全的機制來搭配多個加密訊息重複使用資料金鑰。
+ 避免在 AWS Encryption SDK中意外重複使用資料金鑰，或用盡所有金鑰。
此值在訊息格式版本 1 為 128 位元，在版本 2 為 256 位元。

**AAD 長度**  
額外的驗證資料 (AAD) 的長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含 AAD 的位元組數量。  
當[加密內容](concepts.md#encryption-context)為空時，AAD 長度欄位的值為 0。

**AAD**  
額外的驗證資料。AAD 為[加密內容](concepts.md#encryption-context)編碼方式，它是金鑰值組的陣列，當中的每個金鑰與值皆為 UTF-8 編碼字元組成的字串。加密內容會轉換為位元組序列，並用於表示 AAD 數值。當加密內容為空白時，標題中不會有 AAD 欄位。  
如果使用[含有簽章的演算法](algorithms-reference.md)，加密內容就必須包含金鑰值組 `{'aws-crypto-public-key', Qtxt}`。Qtxt 代表根據 [SEC 1 版本 2.0](http://www.secg.org/sec1-v2.pdf) 壓縮，然後以 base64 編碼的橢圓曲線點 Q。加密內容可以包含其他值，但所建構 AAD 的長度上限為 2^16 - 1 位元組。  
下表將說明 AAD 的組成欄位。金鑰會依照 UTF-8 字元碼來遞增排序金鑰值組。位元組依顯示順序附加。    
**AAD 結構**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/message-format.html)  
**鍵值對計數**  
AAD 中的金鑰值組數量。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出 AAD 中的金鑰值組數量。AAD 中的金鑰值組數量上限為 2^16 - 1。  
如果沒有加密內容，或加密內容為空白，此欄位就不會出現在 AAD 結構中。  
**金鑰長度**  
金鑰值組的金鑰長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含金鑰的位元組數量。  
**金鑰**  
金鑰值組的金鑰。它會以 UTF-8 編碼位元組序列表示。  
**值長度**  
金鑰值組的值長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含值的位元組數量。  
**值**  
金鑰值組的值。它會以 UTF-8 編碼位元組序列表示。

**加密的資料金鑰計數**  
加密資料金鑰的數量。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出加密資料金鑰的數量。每個訊息中的加密資料金鑰數目上限為 65，535 (2^16 - 1)。

**加密的資料金鑰 (s)**  
加密資料金鑰的序列。序列長度取決於加密資料金鑰的數量與每個加密資料金鑰的長度。序列會包含至少一個加密資料金鑰。  
下表將說明每個加密資料金鑰的組成欄位。位元組依顯示順序附加。    
**加密資料金鑰結構**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/message-format.html)  
**金鑰提供者 ID 長度**  
金鑰提供者識別碼的長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含金鑰提供者 ID 的位元組數量。  
**金鑰提供者 ID**  
金鑰提供者識別碼。它會用來指出加密資料金鑰的提供者，以而且可供擴充。  
**金鑰提供者資訊長度**  
金鑰提供者資訊的長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含金鑰提供者資訊的位元組數量。  
**金鑰提供者資訊**  
金鑰提供者資訊。它會取決於金鑰提供者。  
當 AWS KMS 是主金鑰提供者或您使用 AWS KMS keyring 時，此值會包含 的 Amazon Resource Name (ARN) AWS KMS key。  
**加密的資料金鑰長度**  
加密資料金鑰的長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含加密資料金鑰的位元組數量。  
**加密的資料金鑰**  
加密資料金鑰。這是由金鑰提供者所加密的資料加密金鑰。

**內容類型**  
加密資料的類型，非影格或影格。  
盡可能使用影格資料。僅 AWS Encryption SDK 支援傳統用途的非影格資料。的某些語言實作仍然 AWS Encryption SDK 可以產生非框架加密文字。所有支援的語言實作都可以解密影格和非影格加密文字。
影格資料分為等長部分；每個部分都會個別加密。具框架內容為類型 2，並在十六進位表示法中編碼為位元組 `02`。  
非影格資料不會分割；它是單一加密 Blob。無框架內容為類型 1，並在十六進位表示法中編碼為位元組 `01`。

**預留**  
已保留的 4 位元組序列。此值必須為 0。它會在十六進位表示法中編碼為 `00 00 00 00` (也就是以 4 位元組序列表示且等於 0 的 32 位元整數值)。  
此欄位不存在於訊息格式第 2 版中。

**IV 長度**  
初始向量 (IV) 的長度。它會以 1 元組數值表示，並解譯為 8 位元的無符號整數，指出包含 IV 的位元組數量。此值取決於產生訊息的[演算法](algorithms-reference.md) IV 位元組值。  
此欄位不存在於訊息格式第 2 版中，僅支援在訊息標頭中使用確定性 IV 值的演算法套件。

**影格長度**  
每個影格資料影格的長度。它是 4 位元組值，解譯為 32 位元無符號整數，指定每個影格中的位元組數。當資料為非框架時，也就是當`Content Type`欄位的值為 1 時，此值必須為 0。  
盡可能使用影格資料。僅 AWS Encryption SDK 支援傳統用途的非影格資料。的某些語言實作仍然 AWS Encryption SDK 可以產生非框架加密文字。所有支援的語言實作都可以解密影格和非影格加密文字。

**演算法套件資料**  
產生訊息的[演算法](algorithms-reference.md)所需的補充資料。長度和內容由演算法決定。其長度可能是 0。  
此欄位不存在於訊息格式版本 1。

**標頭身分驗證**  
標題驗證取決於產生訊息的[演算法](algorithms-reference.md)。標題驗證會計算整個標題。當中包含一個 IV 與一個驗證標籤。位元組依顯示順序附加。    
**標題驗證結構**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/message-format.html)  
**IV**  
用來計算標題驗證標籤的初始向量 (IV)。  
此欄位不存在於訊息格式第 2 版的標頭中。訊息格式第 2 版僅支援在訊息標頭中使用確定性 IV 值的演算法套件。  
**身分驗證標籤**  
標題的驗證值。這個值會用來驗證標題的整體內容。

## 本文結構
<a name="body-structure"></a>

訊息本文會包含加密資料，也就是所謂的*加密文字*。本文的結構會取決於內容類型 (無框架或具框架)。下面章節將說明每個內容類型的訊息本文格式。訊息內文結構在訊息格式版本 1 和 2 中是相同的。

**Topics**
+ [無框架資料](#body-no-framing)
+ [具框架資料](#body-framing)

### 無框架資料
<a name="body-no-framing"></a>

無框架資料會於單一 Blob 中使用唯一的 IV 與[本文 AAD](body-aad-reference.md) 進行加密。

**注意**  
盡可能使用影格資料。僅 AWS Encryption SDK 支援傳統用途的非影格資料。的某些語言實作仍然 AWS Encryption SDK 可以產生非框架加密文字。所有支援的語言實作都可以解密影格和非影格加密文字。

下表將說明無框架資料的組成欄位。位元組依顯示順序附加。


**無框架本文結構**  

| 欄位 | 長度 (以位元組為單位) | 
| --- | --- | 
| [IV](#body-unframed-iv) | 變數. 等於標題 [IV Length](#header-iv-length)位元組中指定的值。 | 
| [Encrypted Content Length](#body-unframed-content-length) | 8 | 
| [Encrypted Content](#body-unframed-content) | 變數. 等於前 8 個位元組中指定的值 (加密內容長度)。 | 
| [Authentication Tag](#body-unframed-tag) | 變數. 取決於使用的[演算法實作](algorithms-reference.md)。 | 

**IV**  
搭配[加密演算法](algorithms-reference.md)使用的初始向量 (IV)。

**加密的內容長度**  
加密內容或*加密文字*的長度。它會以 8 元組數值表示，並解譯為 64 位元的無符號整數，指出包含加密內容的位元組數量。  
就技術層面而言，允許的最大值為 2^63 - 1，或 8 Exbibyte (8 EiB)。不過，基於[實作演算法](algorithms-reference.md)所帶來的限制，現實層面的最大值則為 2^36 - 32，也就是 64 Gibibyte (64 GiB)。  
基於語言限制，此 SDK 的 Java 實作會將這個值進一步限制在 2^31 - 1 內，也就是 20 Gibibyte (2 GiB)。

**加密的內容**  
由[加密演算法](algorithms-reference.md)傳回的加密內容 (加密文字)。

**身分驗證標籤**  
本文的驗證值。這個值會用來驗證訊息本文。

### 具框架資料
<a name="body-framing"></a>

在具框架資料中，純文字資料被劃分為等長的部分，稱為*框架*。會使用唯一的 IV 和[內文 AAD](body-aad-reference.md) 分別 AWS Encryption SDK 加密每個影格。

**注意**  
盡可能使用影格資料。僅 AWS Encryption SDK 支援傳統用途的非影格資料。的某些語言實作仍然 AWS Encryption SDK 可以產生非框架加密文字。所有支援的語言實作都可以解密影格和非影格加密文字。

 

[框架長度](#header-frame-length)，即框架中[加密內容](#body-framed-regular-content)的長度，可能會因每個訊息而有所不同。框架中的位元組數目上限為 2^32 - 1。訊息中框架的位元組數目上限為 2^32 - 1。

框架包含兩種類型：*一般*與*最終*。每個訊息都必須組成為或包含最終框架。

訊息中的所有一般框架都有相同的框架長度。最終框架可以有不同的框架長度。

具框架資料中的框架組成會因加密內容的長度而有所不同。
+ **等於影格長度** — 當加密的內容長度與一般影格的影格長度相同時，訊息可以包含包含資料的一般影格，接著是長度為零 (0) 的最終影格。或者，訊息的組成可以為僅包含資料的最終框架。在此情況下，最終框架的框架長度與一般框架相同。
+ 影**格長度的倍**數 — 當加密的內容長度是一般影格長度的確切倍數時，訊息可以結束於包含資料的一般影格，接著是長度為零 (0) 的最終影格。或者，訊息的結尾可以為包含資料的最終框架。在此情況下，最終框架的框架長度與一般框架相同。
+ **不是影格長度的倍**數 — 當加密的內容長度不是一般影格影格長度的確切倍數時，最終影格會包含剩餘的資料。最終框架的框架長度小於一般框架的框架長度。
+ **小於影格長度** — 當加密的內容長度小於一般影格的影格長度時，訊息會包含包含所有資料的最終影格。最終框架的框架長度小於一般框架的框架長度。

下表將說明框架的組成欄位。位元組依顯示順序附加。


**具框架本文結構、一般框架**  

| 欄位 | 長度 (以位元組為單位) | 
| --- | --- | 
| [Sequence Number](#body-framed-regular-sequence-number) | 4 | 
| [IV](#body-framed-regular-iv) | 變數. 等於標題 [IV Length](#header-iv-length)位元組中指定的值。 | 
| [Encrypted Content](#body-framed-regular-content) | 變數. 等於標題[Frame Length](#header-frame-length)中指定的值。 | 
| [Authentication Tag](#body-framed-regular-tag) | 變數. 取決於使用的演算法，會於標題的[Algorithm ID](#header-algorithm-id) 中指定。 | 

**序號**  
框架序號。這個序號為框架的遞增計數器編號。它會以 4 位元組數值表示，並解譯為 32 位元的無符號整數。  
具框架資料必須從序號 1 開始編號。後續框架必須依序編號，並比前一個框架多出 1。否則，加密程序就會停止，並回報錯誤。

**IV**  
框架的初始向量 (IV)。SDK 會使用決定性方法，為訊息中的每個框架建構不同的 IV。它的長度會由使用的[演算法套件](algorithms-reference.md)指定。

**加密的內容**  
由[加密演算法](algorithms-reference.md)傳回的框架加密內容 (加密文字)。

**身分驗證標籤**  
框架的驗證值。這個值會用來驗證整個框架。


**具框架本文結構、最終框架**  

| 欄位 | 長度 (以位元組為單位) | 
| --- | --- | 
| [Sequence Number End](#body-framed-final-sequence-number-end) | 4 | 
| [Sequence Number](#body-framed-final-sequence-number) | 4 | 
| [IV](#body-framed-final-iv) | 變數. 等於標題 [IV Length](#header-iv-length)位元組中指定的值。 | 
| [Encrypted Content Length](#body-framed-final-content-length) | 4 | 
| [Encrypted Content](#body-framed-final-content) | 變數. 等於前 4 個位元組中指定的值 (加密內容長度)。 | 
| [Authentication Tag](#body-framed-final-tag) | 變數. 取決於使用的演算法，會於標題的[Algorithm ID](#header-algorithm-id) 中指定。 | 

**序號結束**  
最終框架的指標。這個值會在十六進位表示法中編碼為 4 位元組的 `FF FF FF FF`。

**序號**  
框架序號。這個序號為框架的遞增計數器編號。它會以 4 位元組數值表示，並解譯為 32 位元的無符號整數。  
具框架資料必須從序號 1 開始編號。後續框架必須依序編號，並比前一個框架多出 1。否則，加密程序就會停止，並回報錯誤。

**IV**  
框架的初始向量 (IV)。SDK 會使用決定性方法，為訊息中的每個框架建構不同的 IV。IV 長度會由[演算法套件](algorithms-reference.md)指定。

**加密的內容長度**  
加密內容的長度。它會以 4 元組數值表示，並解譯為 32 位元的無符號整數，指出包含框架加密內容的位元組數量。

**加密的內容**  
由[加密演算法](algorithms-reference.md)傳回的框架加密內容 (加密文字)。

**身分驗證標籤**  
框架的驗證值。這個值會用來驗證整個框架。

## 頁尾結構
<a name="footer-structure"></a>

如果使用[含有簽章的演算法](algorithms-reference.md)，訊息格式就會包含頁尾。訊息頁尾包含以訊息標頭和內文計算[的數位簽章](concepts.md#digital-sigs)。下表將說明頁尾的組成欄位。位元組依顯示順序附加。訊息頁尾結構在訊息格式版本 1 和 2 中是相同的。


**頁尾結構**  

| 欄位 | 長度 (以位元組為單位) | 
| --- | --- | 
| [Signature Length](#footer-signature-length) | 2 | 
| [Signature](#footer-signature) | 變數. 等於前 2 個位元組中指定的值 (簽章長度)。 | 

**簽章長度**  
簽章的長度。它會以 2 元組數值表示，並解譯為 16 位元的無符號整數，指出包含簽章的位元組數量。

**簽章**  
簽章本身。