

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS Encryption SDK 参考
<a name="reference"></a>


|  | 
| --- |
|  本页面提供了在您构建与 AWS Encryption SDK兼容的加密库时可供参考的信息。如果您不需要构建自己的兼容加密库，则可能不需要此信息。 要 AWS Encryption SDK 在支持的编程语言之一中使用，请参阅[编程语言](programming-languages.md)。 有关定义适当 AWS Encryption SDK 实现要素的规范，请参阅中的[AWS Encryption SDK 规范](https://github.com/awslabs/aws-encryption-sdk-specification/) GitHub。  | 

 AWS Encryption SDK 使用[支持的算法](supported-algorithms.md)返回包含加密数据和相应加密数据密钥的单个数据结构或*消息*。以下主题介绍了这些算法和数据结构。可以使用该信息构建一些库，它们可以读取和写入与该开发工具包兼容的密文。

**Topics**
+ [消息格式参考](message-format.md)
+ [消息格式示例](message-format-examples.md)
+ [正文 AAD 参考](body-aad-reference.md)
+ [算法参考](algorithms-reference.md)
+ [初始化向量参考](IV-reference.md)
+ [

# AWS KMS 分层钥匙圈技术细节
](hierarchical-keyring-details.md)

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


|  | 
| --- |
|  本页面提供了在您构建与 AWS Encryption SDK兼容的加密库时可供参考的信息。如果您不需要构建自己的兼容加密库，则可能不需要此信息。 要 AWS Encryption SDK 在支持的编程语言之一中使用，请参阅[编程语言](programming-languages.md)。 有关定义适当 AWS Encryption SDK 实现要素的规范，请参阅中的[AWS Encryption SDK 规范](https://github.com/awslabs/aws-encryption-sdk-specification/) GitHub。  | 

中的加密操作 AWS Encryption SDK 返回包含加密数据（密文）和所有加密数据密钥的单个数据结构或加密[消息](concepts.md#message)。要了解该数据结构或构建读取和写入该结构的库，您需要了解消息格式。

消息格式包含至少两个部分：*标头* 和*正文*。在某些情况下，消息格式包含第三个部分（*脚注*）。消息格式按网络字节顺序定义有序的字节序列，也称为 big-endian 格式。消息格式从标头开始，然后是正文，最后是脚注（如果有）。

 AWS Encryption SDK 支持的[算法套件](algorithms-reference.md)使用两种消息格式版本之一。没有[密钥承诺](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**  
使用的算法的标识符。这是一个解释为 16 位无符号整数的 2 字节值。有关算法的更多信息，请参阅[AWS Encryption SDK 算法参考](algorithms-reference.md)。

**消息 ID**  
随机生成的值，用于标识消息。消息 ID：  
+ 唯一地标识加密的消息。
+ 将消息标头弱绑定到消息正文。
+ 提供一种机制以安全地在多个加密的消息中重用数据密钥。
+ 防止在 AWS Encryption SDK中意外重复使用数据密钥或导致密钥失效。
此值在消息格式版本 1 中为 128 位，在版本 2 中为 256 位。

**AAD 长度**  
其他经过身份验证的数据 (AAD) 的长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含 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_cn/encryption-sdk/latest/developer-guide/message-format.html)  
**键值对计数**  
AAD 中的键值对数。这是一个解释为 16 位无符号整数的 2 字节值，它指定 AAD 中的键值对数。AAD 中的最大键值对数为 2^16 - 1 个。  
如果没有加密上下文或加密上下文为空，则在 AAD 结构中不包含该字段。  
**密钥长度**  
键值对的键长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含键的字节数。  
**钥匙**  
键值对的键。这是 UTF-8 编码的字节序列。  
**值长度**  
键值对的值长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含值的字节数。  
**价值**  
键值对的值。这是 UTF-8 编码的字节序列。

**加密数据密钥计数**  
加密的数据密钥数。这是一个解释为 16 位无符号整数的 2 字节值，它指定加密的数据密钥数。每条消息中加密数据密钥的最大数量为 65535（2^16 - 1）。

**加密的数据密钥**  
加密的数据密钥序列。序列长度由加密的数据密钥数和每个密钥的长度决定。该序列包含至少一个加密的数据密钥。  
下表描述了组成每个加密的数据密钥的字段。字节是按显示的顺序附加的。    
**加密的数据密钥结构**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/message-format.html)  
**密钥提供商 ID 长度**  
密钥提供程序标识符的长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含密钥提供程序 ID 的字节数。  
**密钥提供商 ID**  
密钥提供程序标识符。它用于指示加密的数据密钥的提供程序，并且可以进行扩展。  
**密钥提供者信息长度**  
密钥提供程序信息的长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含密钥提供程序信息的字节数。  
**密钥提供商信息**  
密钥提供程序信息。这是由密钥提供程序决定的。  
当 AWS KMS 是主密钥提供者或者您正在使用密 AWS KMS 钥环时，此值包含的 Amazon 资源名称 (ARN)。 AWS KMS key  
**加密数据密钥长度**  
加密的数据密钥的长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含加密的数据密钥的字节数。  
**加密的数据密钥**  
加密的数据密钥。这是密钥提供程序加密的数据加密密钥。

**内容类型**  
加密数据的类型（非帧或帧）。  
尽可能使用帧数据。仅 AWS Encryption SDK 支持传统使用的非成帧数据。的某些语言实现仍然 AWS Encryption SDK 可以生成非成帧的密文。所有支持的语言实现都可以解密成帧和非帧加密文字。
帧数据分割成一些等长的部分；每个部分是单独加密的。帧内容为类型 2，在十六进制表示法中编码为字节 `02`。  
非帧数据不会被分割；是单一的加密 Blob。非帧内容为类型 1，在十六进制表示法中编码为字节 `01`。

**已保留**  
预留的 4 字节序列。该值必须为 0。它在十六进制表示法中编码为字节 `00 00 00 00`（即，等于 0 的 32 位整数值的 4 字节序列）。  
此字段在消息格式版本 2 中不存在。

**四、长度**  
初始化向量 (IV) 的长度。这是一个解释为 8 位无符号整数的 1 字节值，它指定包含 IV 的字节数。该值由生成消息的[算法](algorithms-reference.md)的 IV 字节值决定。  
此字段在消息格式版本 2 中不存在，该版本仅支持在消息标头中使用确定性 IV 值的算法套件。

**帧长**  
帧数据的每个帧的长度。这是一个解释为 32 位无符号整数的 4 字节值，该值指定每个帧的字节数。当数据为非帧数据时，也就是说，当 `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_cn/encryption-sdk/latest/developer-guide/message-format.html)  
**四**  
用于计算标头身份验证标签的初始化向量 (IV)。  
此字段在消息格式版本 2 的标头中不存在。消息格式版本 2 仅支持在消息标头中使用确定性 IV 值的算法套件。  
**身份验证标签**  
标头的身份验证值。它用于对全部标头内容进行身份验证。

## 正文结构
<a name="body-structure"></a>

消息正文包含加密的数据（称为*密文*）。正文结构取决于内容类型（非帧或帧）。以下几节介绍了每种内容类型的消息正文格式。消息格式版本 1 和 2 中的消息正文结构相同。

**Topics**
+ [

### 非帧数据
](#body-no-framing)
+ [

### 帧数据
](#body-framing)

### 非帧数据
<a name="body-no-framing"></a>

非帧数据是在具有唯一 IV 和[正文 AAD](body-aad-reference.md) 的单个 blob 中加密的。

**注意**  
尽可能使用帧数据。仅 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)决定。 | 

**四**  
与[加密算法](algorithms-reference.md)一起使用的初始化向量 (IV)。

**加密内容长度**  
加密的内容（或*密文*）的长度。这是一个解释为 64 位无符号整数的 8 字节值，它指定包含加密的内容的字节数。  
从技术上讲，允许的最大值为 2^63 - 1 或 8 艾字节 (8 EiB)。但实际上，由于[实施的算法](algorithms-reference.md)施加的限制，最大值为 2^36 - 32 或 64 吉字节 (64 GiB)。  
由于 Java 语言限制，该开发工具包的 Java 实施进一步将该值限制为 2^31 - 1 或 2 吉字节 (2 GiB)。

**加密内容**  
[加密算法](algorithms-reference.md)返回的加密内容（密文）。

**身份验证标签**  
正文的身份验证值。它用于对消息正文进行身份验证。

### 帧数据
<a name="body-framing"></a>

在帧数据中，明文数据拆分为相等长度的部分（称为*帧*）。使用独特的 IV 和[主体 AA](body-aad-reference.md) D 分别 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) 中指定）决定。 | 

**序列号**  
帧序列号。它是递增的帧计数器编号。这是一个解释为 32 位无符号整数的 4 字节值。  
帧数据必须从序列号 1 开始。后续的帧必须按顺序编号，并且必须在前一个帧的基础上增加 1。否则，解密过程将停止并报告错误。

**四**  
帧的初始化向量 (IV)。该开发工具包使用确定性的方法为消息中的每个帧构造不同的 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`。

**序列号**  
帧序列号。它是递增的帧计数器编号。这是一个解释为 32 位无符号整数的 4 字节值。  
帧数据必须从序列号 1 开始。后续的帧必须按顺序编号，并且必须在前一个帧的基础上增加 1。否则，解密过程将停止并报告错误。

**四**  
帧的初始化向量 (IV)。该开发工具包使用确定性的方法为消息中的每个帧构造不同的 IV。IV 长度是由[算法套件](algorithms-reference.md)指定的。

**加密内容长度**  
加密的内容的长度。这是一个解释为 32 位无符号整数的 4 字节值，它指定包含帧加密内容的字节数。

**加密内容**  
[加密算法](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 个字节（签名长度）中指定的值。 | 

**签名长度**  
签名的长度。这是一个解释为 16 位无符号整数的 2 字节值，它指定包含签名的字节数。

**签名**  
签名。

# AWS Encryption SDK 消息格式示例
<a name="message-format-examples"></a>


|  | 
| --- |
|  本页面提供了在您构建与 AWS Encryption SDK兼容的加密库时可供参考的信息。如果您不需要构建自己的兼容加密库，则可能不需要此信息。 要 AWS Encryption SDK 在支持的编程语言之一中使用，请参阅[编程语言](programming-languages.md)。 有关定义适当 AWS Encryption SDK 实现要素的规范，请参阅中的[AWS Encryption SDK 规范](https://github.com/awslabs/aws-encryption-sdk-specification/) GitHub。  | 

以下主题显示了 AWS Encryption SDK 消息格式的示例。每个示例都显示了以十六进制表示法表示的原始字节，随后是有关这些字节所表示内容的说明。

**Topics**
+ [

## 帧数据（消息格式版本 1）
](#example-framed)
+ [

## 帧数据（消息格式版本 2）
](#example-framed-2)
+ [

## 非帧数据（消息格式版本 1）
](#example-nonframed)

## 帧数据（消息格式版本 1）
<a name="example-framed"></a>

以下示例显示了[消息格式版本 1](message-format.md) 中帧数据的消息格式。

```
+--------+
| Header |
+--------+
01                                         Version (1.0)
80                                         Type (128, customer authenticated encrypted data)
0378                                       Algorithm ID (see 算法参考)
6E7C0FBD 4DF4A999 717C22A2 DDFE1A27        Message ID (random 128-bit value)
008E                                       AAD Length (142)
0004                                       AAD Key-Value Pair Count (4)
0005                                       AAD Key-Value Pair 1, Key Length (5)
30746869 73                                AAD Key-Value Pair 1, Key ("0This")
0002                                       AAD Key-Value Pair 1, Value Length (2)
6973                                       AAD Key-Value Pair 1, Value ("is")
0003                                       AAD Key-Value Pair 2, Key Length (3)
31616E                                     AAD Key-Value Pair 2, Key ("1an")
000A                                       AAD Key-Value Pair 2, Value Length (10)
656E6372 79774690 6F6E                     AAD Key-Value Pair 2, Value ("encryption")
0008                                       AAD Key-Value Pair 3, Key Length (8)
32636F6E 74657874                          AAD Key-Value Pair 3, Key ("2context")
0007                                       AAD Key-Value Pair 3, Value Length (7)
6578616D 706C65                            AAD Key-Value Pair 3, Value ("example")
0015                                       AAD Key-Value Pair 4, Key Length (21)
6177732D 63727970 746F2D70 75626C69        AAD Key-Value Pair 4, Key ("aws-crypto-public-key")
632D6B65 79
0044                                       AAD Key-Value Pair 4, Value Length (68)
416A4173 7569326F 7430364C 4B77715A        AAD Key-Value Pair 4, Value ("AjAsui2ot06LKwqZXDJnU/Aqc2vD+0OkpOZ1cc8Tg2qd7rs5aLTg7lvfUEW/86+/5w==")
58444A6E 552F4171 63327644 2B304F6B
704F5A31 63633854 67327164 37727335
614C5467 376C7666 5545572F 38362B2F
35773D3D
0002                                       EncryptedDataKeyCount (2)
0007                                       Encrypted Data Key 1, Key Provider ID Length (7)
6177732D 6B6D73                            Encrypted Data Key 1, Key Provider ID ("aws-kms")
004B                                       Encrypted Data Key 1, Key Provider Information Length (75)
61726E3A 6177733A 6B6D733A 75732D77        Encrypted Data Key 1, Key Provider Information ("arn:aws:kms:us-west-2:111122223333:key/715c0818-5825-4245-a755-138a6d9a11e6")
6573742D 323A3131 31313232 32323333
33333A6B 65792F37 31356330 3831382D
35383235 2D343234 352D6137 35352D31
33386136 64396131 316536
00A7                                       Encrypted Data Key 1, Encrypted Data Key Length (167)
01010200 7857A1C1 F7370545 4ECA7C83        Encrypted Data Key 1, Encrypted Data Key
956C4702 23DCE8D7 16C59679 973E3CED
02A4EF29 7F000000 7E307C06 092A8648
86F70D01 0706A06F 306D0201 00306806
092A8648 86F70D01 0701301E 06096086
48016503 04012E30 11040C3F F02C897B
7A12EB19 8BF2D802 0110803B 24003D1F
A5474FBC 392360B5 CB9997E0 6A17DE4C
A6BD7332 6BF86DAB 60D8CCB8 8295DBE9
4707E356 ADA3735A 7C52D778 B3135A47
9F224BF9 E67E87
0007                                       Encrypted Data Key 2, Key Provider ID Length (7)
6177732D 6B6D73                            Encrypted Data Key 2, Key Provider ID ("aws-kms")
004E                                       Encrypted Data Key 2, Key Provider Information Length (78)
61726E3A 6177733A 6B6D733A 63612D63        Encrypted Data Key 2, Key Provider Information ("arn:aws:kms:ca-central-1:111122223333:key/9b13ca4b-afcc-46a8-aa47-be3435b423ff")
656E7472 616C2D31 3A313131 31323232
32333333 333A6B65 792F3962 31336361
34622D61 6663632D 34366138 2D616134
372D6265 33343335 62343233 6666
00A7                                       Encrypted Data Key 2, Encrypted Data Key Length (167)
01010200 78FAFFFB D6DE06AF AC72F79B        Encrypted Data Key 2, Encrypted Data Key
0E57BD87 3F60F4E6 FD196144 5A002C94
AF787150 69000000 7E307C06 092A8648
86F70D01 0706A06F 306D0201 00306806
092A8648 86F70D01 0701301E 06096086
48016503 04012E30 11040C36 CD985E12
D218B674 5BBC6102 0110803B 0320E3CD
E470AA27 DEAB660B 3E0CE8E0 8B1A89E4
57DCC69B AAB1294F 21202C01 9A50D323
72EBAAFD E24E3ED8 7168E0FA DB40508F
556FBD58 9E621C
02                                         Content Type (2, framed data)
00000000                                   Reserved
0C                                         IV Length (12)
00000100                                   Frame Length (256)
4ECBD5C0 9899CA65 923D2347                 IV
0B896144 0CA27950 CA571201 4DA58029        Authentication Tag
+------+
| Body |
+------+
00000001                                   Frame 1, Sequence Number (1)
6BD3FE9C ADBCB213 5B89E8F1                 Frame 1, IV
1F6471E0 A51AF310 10FA9EF6 F0C76EDF        Frame 1, Encrypted Content
F5AFA33C 7D2E8C6C 9C5D5175 A212AF8E
FBD9A0C3 C6E3FB59 C125DBF2 89AC7939
BDEE43A8 0F00F49E ACBBD8B2 1C785089
A90DB923 699A1495 C3B31B50 0A48A830
201E3AD9 1EA6DA14 7F6496DB 6BC104A4
DEB7F372 375ECB28 9BF84B6D 2863889F
CB80A167 9C361C4B 5EC07438 7A4822B4
A7D9D2CC 5150D414 AF75F509 FCE118BD
6D1E798B AEBA4CDB AD009E5F 1A571B77
0041BC78 3E5F2F41 8AF157FD 461E959A
BB732F27 D83DC36D CC9EBC05 00D87803
57F2BB80 066971C2 DEEA062F 4F36255D
E866C042 E1382369 12E9926B BA40E2FC
A820055F FB47E428 41876F14 3B6261D9
5262DB34 59F5D37E 76E46522 E8213640
04EE3CC5 379732B5 F56751FA 8E5F26AD        Frame 1, Authentication Tag
00000002                                   Frame 2, Sequence Number (2)
F1140984 FF25F943 959BE514                 Frame 2, IV
216C7C6A 2234F395 F0D2D9B9 304670BF        Frame 2, Encrypted Content
A1042608 8A8BCB3F B58CF384 D72EC004
A41455B4 9A78BAC9 36E54E68 2709B7BD
A884C1E1 705FF696 E540D297 446A8285
23DFEE28 E74B225A 732F2C0C 27C6BDA2
7597C901 65EF3502 546575D4 6D5EBF22
1FF787AB 2E38FD77 125D129C 43D44B96
778D7CEE 3C36625F FF3A985C 76F7D320
ED70B1F3 79729B47 E7D9B5FC 02FCE9F5
C8760D55 7779520A 81D54F9B EC45219D
95941F7E 5CBAEAC8 CEC13B62 1464757D
AC65B6EF 08262D74 44670624 A3657F7F
2A57F1FD E7060503 AC37E197 2F297A84
DF1172C2 FA63CF54 E6E2B9B6 A86F582B
3B16F868 1BBC5E4D 0B6919B3 08D5ABCF
FECDC4A4 8577F08B 99D766A1 E5545670
A61F0A3B A3E45A84 4D151493 63ECA38F        Frame 2, Authentication Tag
FFFFFFFF                                   Final Frame, Sequence Number End
00000003                                   Final Frame, Sequence Number (3)
35F74F11 25410F01 DD9E04BF                 Final Frame, IV
0000008E                                   Final Frame, Encrypted Content Length (142)
F7A53D37 2F467237 6FBD0B57 D1DFE830        Final Frame, Encrypted Content
B965AD1F A910AA5F 5EFFFFF4 BC7D431C
BA9FA7C4 B25AF82E 64A04E3A A0915526
88859500 7096FABB 3ACAD32A 75CFED0C
4A4E52A3 8E41484D 270B7A0F ED61810C
3A043180 DF25E5C5 3676E449 0986557F
C051AD55 A437F6BC 139E9E55 6199FD60
6ADC017D BA41CDA4 C9F17A83 3823F9EC
B66B6A5A 80FDB433 8A48D6A4 21CB
811234FD 8D589683 51F6F39A 040B3E3B        Final Frame, Authentication Tag
+--------+
| Footer |
+--------+
0066                                       Signature Length (102)
30640230 085C1D3C 63424E15 B2244448        Signature
639AED00 F7624854 F8CF2203 D7198A28
758B309F 5EFD9D5D 2E07AD0B 467B8317
5208B133 02301DF7 2DFC877A 66838028
3C6A7D5E 4F8B894E 83D98E7C E350F424
7E06808D 0FE79002 E24422B9 98A0D130
A13762FF 844D
```

## 帧数据（消息格式版本 2）
<a name="example-framed-2"></a>

以下示例显示了[消息格式版本 2](message-format.md) 中帧数据的消息格式。

```
+--------+
| Header |
+--------+
02                                         Version (2.0)
0578                                       Algorithm ID (see Algorithms reference)
122747eb 21dfe39b 38631c61 7fad7340
cc621a30 32a11cc3 216d0204 fd148459        Message ID (random 256-bit value)
008e                                       AAD Length (142)
0004                                       AAD Key-Value Pair Count (4)
0005                                       AAD Key-Value Pair 1, Key Length (5)
30546869 73                                AAD Key-Value Pair 1, Key ("0This")
0002                                       AAD Key-Value Pair 1, Value Length (2)
6973                                       AAD Key-Value Pair 1, Value ("is")
0003                                       AAD Key-Value Pair 2, Key Length (3)
31616e                                     AAD Key-Value Pair 2, Key ("1an")
000a                                       AAD Key-Value Pair 2, Value Length (10)
656e6372 79707469 6f6e                     AAD Key-Value Pair 2, Value ("encryption")
0008                                       AAD Key-Value Pair 3, Key Length (8)
32636f6e 74657874                          AAD Key-Value Pair 3, Key ("2context")
0007                                       AAD Key-Value Pair 3, Value Length (7)
6578616d 706c65                            AAD Key-Value Pair 3, Value ("example")
0015                                       AAD Key-Value Pair 4, Key Length (21)
6177732d 63727970 746f2d70 75626c69        AAD Key-Value Pair 4, Key ("aws-crypto-public-key")
632d6b65 79
0044                                       AAD Key-Value Pair 4, Value Length (68)
41746733 72703845 41345161 36706669        AAD Key-Value Pair 4, Value ("QXRnM3JwOEVBNFFhNnBmaTk3MUlTNTk3NHpOMnlZWE5vSmtwRHFPc0dIYkVaVDRqME5OMlFkRStmbTFVY01WdThnPT0=")
39373149 53353937 347a4e32 7959584e
6f4a6b70 44714f73 47486245 5a54346a
304e4e32 5164452b 666d3155 634d5675
38673d3d
0001                                       Encrypted Data Key Count (1)
0007                                       Encrypted Data Key 1, Key Provider ID Length (7)
6177732d 6b6d73                            Encrypted Data Key 1, Key Provider ID ("aws-kms")
004b                                       Encrypted Data Key 1, Key Provider Information Length (75)
61726e3a 6177733a 6b6d733a 75732d77        Encrypted Data Key 1, Key Provider Information ("arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f")
6573742d 323a3635 38393536 36303038
33333a6b 65792f62 33353337 6566312d
64386463 2d343738 302d3966 35612d35
35373736 63626232 663766
00a7                                       Encrypted Data Key 1, Encrypted Data Key Length (167)
01010100 7840f38c 275e3109 7416c107        Encrypted Data Key 1, Encrypted Data Key
29515057 1964ada3 ef1c21e9 4c8ba0bd
bc9d0fb4 14000000 7e307c06 092a8648
86f70d01 0706a06f 306d0201 00306806
092a8648 86f70d01 0701301e 06096086
48016503 04012e30 11040c39 32d75294
06063803 f8460802 0110803b 2a46bc23
413196d2 903bf1d7 3ed98fc8 a94ac6ed
e00ee216 74ec1349 12777577 7fa052a5
ba62e9e4 f2ac8df6 bcb1758f 2ce0fb21
cc9ee5c9 7203bb
02                                         Content Type (2, framed data)
00001000                                   Frame Length (4096)
05cd035b 29d5499d 4587570b 87502afe        Algorithm Suite Data (key commitment)
634f7b2c c3df2aa9 88a10105 4a2c7687 
76cb339f 2536741f 59a1c202 4f2594ab        Authentication Tag
+------+
| Body |
+------+
ffffffff                                   Final Frame, Sequence Number End
00000001                                   Final Frame, Sequence Number (1)
00000000 00000000 00000001                 Final Frame, IV
00000009                                   Final Frame, Encrypted Content Length (9)
fa6e39c6 02927399 3e                       Final Frame, Encrypted Content
f683a564 405d68db eeb0656c d57c9eb0        Final Frame, Authentication Tag
+--------+
| Footer |
+--------+
0067                                       Signature Length (103)
30650230 2a1647ad 98867925 c1712e8f        Signature 
ade70b3f 2a2bc3b8 50eb91ef 56cfdd18 
967d91d8 42d92baf 357bba48 f636c7a0
869cade2 023100aa ae12d08f 8a0afe85
e5054803 110c9ed8 11b2e08a c4a052a9
074217ea 3b01b660 534ac921 bf091d12
3657e2b0 9368bd
```

## 非帧数据（消息格式版本 1）
<a name="example-nonframed"></a>

以下示例显示了非帧数据的消息格式。

**注意**  
尽可能使用帧数据。仅 AWS Encryption SDK 支持传统使用的非成帧数据。的某些语言实现仍然 AWS Encryption SDK 可以生成非成帧的密文。所有支持的语言实现都可以解密成帧和非帧加密文字。

```
+--------+
| Header |
+--------+
01                                         Version (1.0)
80                                         Type (128, customer authenticated encrypted data)
0378                                       Algorithm ID (see 算法参考)
B8929B01 753D4A45 C0217F39 404F70FF        Message ID (random 128-bit value)
008E                                       AAD Length (142)
0004                                       AAD Key-Value Pair Count (4)
0005                                       AAD Key-Value Pair 1, Key Length (5)
30746869 73                                AAD Key-Value Pair 1, Key ("0This")
0002                                       AAD Key-Value Pair 1, Value Length (2)
6973                                       AAD Key-Value Pair 1, Value ("is")
0003                                       AAD Key-Value Pair 2, Key Length (3)
31616E                                     AAD Key-Value Pair 2, Key ("1an")
000A                                       AAD Key-Value Pair 2, Value Length (10)
656E6372 79774690 6F6E                     AAD Key-Value Pair 2, Value ("encryption")
0008                                       AAD Key-Value Pair 3, Key Length (8)
32636F6E 74657874                          AAD Key-Value Pair 3, Key ("2context")
0007                                       AAD Key-Value Pair 3, Value Length (7)
6578616D 706C65                            AAD Key-Value Pair 3, Value ("example")
0015                                       AAD Key-Value Pair 4, Key Length (21)
6177732D 63727970 746F2D70 75626C69        AAD Key-Value Pair 4, Key ("aws-crypto-public-key")
632D6B65 79
0044                                       AAD Key-Value Pair 4, Value Length (68)
41734738 67473949 6E4C5075 3136594B        AAD Key-Value Pair 4, Value ("AsG8gG9InLPu16YKlqXTOD+nykG8YqHAhqecj8aXfD2e5B4gtVE73dZkyClA+rAMOQ==")
6C715854 4F442B6E 796B4738 59714841
68716563 6A386158 66443265 35423467
74564537 33645A6B 79436C41 2B72414D
4F513D3D
0002                                       Encrypted Data Key Count (2)
0007                                       Encrypted Data Key 1, Key Provider ID Length (7)
6177732D 6B6D73                            Encrypted Data Key 1, Key Provider ID ("aws-kms")
004B                                       Encrypted Data Key 1, Key Provider Information Length (75)
61726E3A 6177733A 6B6D733A 75732D77        Encrypted Data Key 1, Key Provider Information ("arn:aws:kms:us-west-2:111122223333:key/715c0818-5825-4245-a755-138a6d9a11e6")
6573742D 323A3131 31313232 32323333
33333A6B 65792F37 31356330 3831382D
35383235 2D343234 352D6137 35352D31
33386136 64396131 316536
00A7                                       Encrypted Data Key 1, Encrypted Data Key Length (167)
01010200 7857A1C1 F7370545 4ECA7C83        Encrypted Data Key 1, Encrypted Data Key
956C4702 23DCE8D7 16C59679 973E3CED
02A4EF29 7F000000 7E307C06 092A8648
86F70D01 0706A06F 306D0201 00306806
092A8648 86F70D01 0701301E 06096086
48016503 04012E30 11040C28 4116449A
0F2A0383 659EF802 0110803B B23A8133
3A33605C 48840656 C38BCB1F 9CCE7369
E9A33EBE 33F46461 0591FECA 947262F3
418E1151 21311A75 E575ECC5 61A286E0
3E2DEBD5 CB005D
0007                                       Encrypted Data Key 2, Key Provider ID Length (7)
6177732D 6B6D73                            Encrypted Data Key 2, Key Provider ID ("aws-kms")
004E                                       Encrypted Data Key 2, Key Provider Information Length (78)
61726E3A 6177733A 6B6D733A 63612D63        Encrypted Data Key 2, Key Provider Information ("arn:aws:kms:ca-central-1:111122223333:key/9b13ca4b-afcc-46a8-aa47-be3435b423ff")
656E7472 616C2D31 3A313131 31323232
32333333 333A6B65 792F3962 31336361
34622D61 6663632D 34366138 2D616134
372D6265 33343335 62343233 6666
00A7                                       Encrypted Data Key 2, Encrypted Data Key Length (167)
01010200 78FAFFFB D6DE06AF AC72F79B        Encrypted Data Key 2, Encrypted Data Key
0E57BD87 3F60F4E6 FD196144 5A002C94
AF787150 69000000 7E307C06 092A8648
86F70D01 0706A06F 306D0201 00306806
092A8648 86F70D01 0701301E 06096086
48016503 04012E30 11040CB2 A820D0CC
76616EF2 A6B30D02 0110803B 8073D0F1
FDD01BD9 B0979082 099FDBFC F7B13548
3CC686D7 F3CF7C7A CCC52639 122A1495
71F18A46 80E2C43F A34C0E58 11D05114
2A363C2A E11397
01                                         Content Type (1, nonframed data)
00000000                                   Reserved
0C                                         IV Length (12)
00000000                                   Frame Length (0, nonframed data)
734C1BBE 032F7025 84CDA9D0                 IV
2C82BB23 4CBF4AAB 8F5C6002 622E886C        Authentication Tag
+------+
| Body |
+------+
D39DD3E5 915E0201 77A4AB11                 IV
00000000 0000028E                          Encrypted Content Length (654)
E8B6F955 B5F22FE4 FD890224 4E1D5155        Encrypted Content
5871BA4C 93F78436 1085E4F8 D61ECE28
59455BD8 D76479DF C28D2E0B BDB3D5D3
E4159DFE C8A944B6 685643FC EA24122B
6766ECD5 E3F54653 DF205D30 0081D2D8
55FCDA5B 9F5318BC F4265B06 2FE7C741
C7D75BCC 10F05EA5 0E2F2F40 47A60344
ECE10AA7 559AF633 9DE2C21B 12AC8087
95FE9C58 C65329D1 377C4CD7 EA103EC1
31E4F48A 9B1CC047 EE5A0719 704211E5
B48A2068 8060DF60 B492A737 21B0DB21
C9B21A10 371E6179 78FAFB0B BAAEC3F4
9D86E334 701E1442 EA5DA288 64485077
54C0C231 AD43571A B9071925 609A4E59
B8178484 7EB73A4F AAE46B26 F5B374B8
12B0000C 8429F504 936B2492 AAF47E94
A5BA804F 7F190927 5D2DF651 B59D4C2F
A15D0551 DAEBA4AF 2060D0D5 CB1DA4E6
5E2034DB 4D19E7CD EEA6CF7E 549C86AC
46B2C979 AB84EE12 202FD6DF E7E3C09F
C2394012 AF20A97E 369BCBDA 62459D3E
C6FFB914 FEFD4DE5 88F5AFE1 98488557
1BABBAE4 BE55325E 4FB7E602 C1C04BEE
F3CB6B86 71666C06 6BF74E1B 0F881F31
B731839B CF711F6A 84CA95F5 958D3B44
E3862DF6 338E02B5 C345CFF8 A31D54F3
6920AA76 0BF8E903 552C5A04 917CCD11
D4E5DF5C 491EE86B 20C33FE1 5D21F0AD
6932E67C C64B3A26 B8988B25 CFA33E2B
63490741 3AB79D60 D8AEFBE9 2F48E25A
978A019C FE49EE0A 0E96BF0D D6074DDB
66DFF333 0E10226F 0A1B219C BE54E4C2
2C15100C 6A2AA3F1 88251874 FDC94F6B
9247EF61 3E7B7E0D 29F3AD89 FA14A29C
76E08E9B 9ADCDF8C C886D4FD A69F6CB4
E24FDE26 3044C856 BF08F051 1ADAD329
C4A46A1E B5AB72FE 096041F1 F3F3571B
2EAFD9CB B9EB8B83 AE05885A 8F2D2793
1E3305D9 0C9E2294 E8AD7E3B 8E4DEC96
6276C5F1 A3B7E51E 422D365D E4C0259C
50715406 822D1682 80B0F2E5 5C94
65B2E942 24BEEA6E A513F918 CCEC1DE3      Authentication Tag
+--------+
| Footer |
+--------+
0067                                     Signature Length (103)
30650230 7229DDF5 B86A5B64 54E4D627      Signature
CBE194F1 1CC0F8CF D27B7F8B F50658C0
BE84B355 3CED1721 A0BE2A1B 8E3F449E
1BEB8281 023100B2 0CB323EF 58A4ACE3
1559963B 889F72C3 B15D1700 5FB26E61
331F3614 BC407CEE B86A66FA CBF74D9E
34CB7E4B 363A38
```

# 正文其他经过身份验证的数据 (AAD) 参考 AWS Encryption SDK
<a name="body-aad-reference"></a>


|  | 
| --- |
|  本页面提供了在您构建与 AWS Encryption SDK兼容的加密库时可供参考的信息。如果您不需要构建自己的兼容加密库，则可能不需要此信息。 要 AWS Encryption SDK 在支持的编程语言之一中使用，请参阅[编程语言](programming-languages.md)。 有关定义适当 AWS Encryption SDK 实现要素的规范，请参阅中的[AWS Encryption SDK 规范](https://github.com/awslabs/aws-encryption-sdk-specification/) GitHub。  | 

对于每个加密操作，您必须为 [AES-GCM 算法](algorithms-reference.md)提供其他经过身份验证的数据 (AAD)。这适用于帧和非帧[正文数据](message-format.md#body-structure)。有关 AAD 及其在 Galois/Counter 模式 (GCM) 中的使用方式的更多信息，请参阅分[组密码操作模式建议： Galois/Counter 模式 (GCM) 和 G](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf) MAC。

下表描述了组成正文 AAD 的字段。字节是按显示的顺序附加的。


**正文 AAD 结构**  

| 字段 | 长度（字节） | 
| --- | --- | 
| [Message ID](#body-aad-message-id) | 16 | 
| [Body AAD Content](#body-aad-content) | 变量。请参阅以下列表中的正文 AAD 内容。 | 
| [Sequence Number](#body-aad-sequence-number) | 4 | 
| [Content Length](#body-aad-content-length) | 8 | 

**消息 ID**  
在消息标头中设置的相同 [Message ID](message-format.md#header-message-id) 值。

**正文 AAD 内容**  
使用的正文数据类型确定的 UTF-8 编码值。  
对于[非帧数据](message-format.md#body-no-framing)，请使用 `AWSKMSEncryptionClient Single Block` 值。  
对于[帧数据](message-format.md#body-framing)中的常规帧，请使用 `AWSKMSEncryptionClient Frame` 值。  
对于[帧数据](message-format.md#body-framing)中的最终帧，请使用 `AWSKMSEncryptionClient Final Frame` 值。

**序列号**  
解释为 32 位无符号整数的 4 字节值。  
对于[帧数据](message-format.md#body-framing)，这是帧序列号。  
对于[非帧数据](message-format.md#body-no-framing)，请使用值 1（在十六进制表示法中编码为 4 字节 `00 00 00 01`）。

**内容长度**  
为加密算法提供的明文数据的长度（字节）。这是一个解释为 64 位无符号整数的 8 字节值。

# AWS Encryption SDK 算法参考
<a name="algorithms-reference"></a>


|  | 
| --- |
|  本页面提供了在您构建与 AWS Encryption SDK兼容的加密库时可供参考的信息。如果您不需要构建自己的兼容加密库，则可能不需要此信息。 要 AWS Encryption SDK 在支持的编程语言之一中使用，请参阅[编程语言](programming-languages.md)。 有关定义适当 AWS Encryption SDK 实现要素的规范，请参阅中的[AWS Encryption SDK 规范](https://github.com/awslabs/aws-encryption-sdk-specification/) GitHub。  | 

如果您正在构建自己的库，该库可以读取和写入与兼容的密文 AWS Encryption SDK，则需要了解如何 AWS Encryption SDK 实现支持的算法套件来加密原始数据。

 AWS Encryption SDK 支持以下算法套件。所有 AES-GCM 算法套件都有一个 12 字节的[初始化向量](IV-reference.md)和一个 16 字节的 AES-GCM 身份验证标签。默认算法套件因 AWS Encryption SDK 版本和所选密钥承诺策略而异。有关详细信息，请参阅[承诺策略和算法套件](troubleshooting-migration.md#configuration-conflict_1)。


**AWS Encryption SDK 算法套件**  

| 算法 ID | 消息格式版本 | 加密算法 | 数据密钥长度（位） | 密钥派生算法 | 签名算法 | 密钥承诺算法 | 算法套件数据长度（字节） | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| 05 78 | 0x02 | AES-GCM | 256 | HKDF 以及 SHA-512 | ECDSA 以及 P-384 和 SHA-384 | HKDF 以及 SHA-512 | 32（密钥承诺） | 
| 04 78 | 0x02 | AES-GCM | 256 | HKDF 以及 SHA-512 | 无 | HKDF 以及 SHA-512 | 32（密钥承诺） | 
| 03 78 | 0x01 | AES-GCM | 256 | HKDF 以及 SHA-384 | ECDSA 以及 P-384 和 SHA-384 | 无 | 不适用 | 
| 03 46 | 0x01 | AES-GCM | 192 | HKDF 以及 SHA-384 | ECDSA 以及 P-384 和 SHA-384 | 无 | 不适用 | 
| 02 14 | 0x01 | AES-GCM | 128 | HKDF 以及 SHA-256 | ECDSA 以及 P-256 和 SHA-256 | 无 | 不适用 | 
| 01 78 | 0x01 | AES-GCM | 256 | HKDF 以及 SHA-256 | 无 | 无 | 不适用 | 
| 01 46 | 0x01 | AES-GCM | 192 | HKDF 以及 SHA-256 | 无 | 无 | 不适用 | 
| 01 14 | 0x01 | AES-GCM | 128 | HKDF 以及 SHA-256 | 无 | 无 | 不适用 | 
| 00 78 | 0x01 | AES-GCM | 256 | 无 | 无 | 无 | 不适用 | 
| 00 46 | 0x01 | AES-GCM | 192 | 无 | 无 | 无 | 不适用 | 
| 00 14 | 0x01 | AES-GCM | 128 | 无 | 无 | 无 | 不适用 | 

**算法 ID**  
一个 2 字节十六进制值，用于唯一地标识算法实施。该值存储在加密文字的[消息标头](message-format.md#header-structure)中。

**消息格式版本**  
消息格式的版本。带有密钥承诺的算法套件使用消息格式版本 2（0x02）。没有密钥承诺的算法套件使用消息格式版本 1（0x01）。

**算法套件数据长度**  
特定于算法套件的数据长度（以字节为单位）。只有消息格式版本 2（0x02）支持此字段。在消息格式版本 2（0x02）中，此数据出现在消息标头的 `Algorithm suite data` 字段中。支持[密钥承诺](concepts.md#key-commitment)的算法套件使用 32 字节作为密钥承诺字符串。有关更多信息，请参阅该列表中的**密钥承诺算法**。

**数据密钥长度**  
[数据密钥](concepts.md#DEK)的长度（以位为单位）。 AWS Encryption SDK 支持 256 位、192 位和 128 位密钥。数据密钥是由[密钥环](concepts.md#keyring)或主密钥生成的。  
在某些实现中，此数据密钥用作基于 HMAC 的密 extract-and-expand钥派生函数 (HKDF) 的输入。HKDF 的输出用作加密算法中的数据加密密钥。有关更多信息，请参阅该列表中的**密钥派生算法**。

**加密算法**  
与加密算法一起使用的名称和模式。中的算法套件 AWS Encryption SDK 使用带 Galois/Counter 模式 (GCM) 的高级加密标准 (AES) 加密算法。

**密钥承诺算法**  
用于计算密钥承诺字符串的算法。输出存储在消息标头的 `Algorithm suite data` 字段中，用于验证密钥承诺的数据密钥。  
有关向算法套件添加密钥承诺的技术说明，请参阅 Cryptology ePrint Archive AEADs 中的[密钥提交](https://eprint.iacr.org/2020/1153)。

**密钥派生算法**  
基于 HMAC 的 extract-and-expand密钥派生函数 (HKDF)，用于派生数据加密密钥。 AWS Encryption SDK 使用 [RFC](https://tools.ietf.org/html/rfc5869) 5869 中定义的 HKDF。  
**没有密钥承诺的算法套件**（算法 ID `01xx` – `03xx`）  
+ 使用的哈希函数是 SHA-384 或 SHA-256，取决于算法套件。
+ 对于提取步骤：
  + 不使用加密盐。根据 RFC，加密盐设置为包含零的字符串。字符串长度等于哈希函数输出长度；即，SHA-384 为 48 个字节，SHA-256 为 32 个字节。
  + 输入加密材料是来自密钥环或主密钥提供程序的数据密钥。
+ 对于扩展步骤：
  + 输入伪随机密钥是提取步骤的输出。
  + 输入信息是将算法 ID 和消息 ID（按此顺序）串联在一起的结果。
  + 输出加密材料的长度是**数据密钥长度**。该输出用作加密算法中的数据加密密钥。
**带有密钥承诺的算法套件**（算法 ID `04xx` 和`05xx`）  
+ 使用的哈希函数是 SHA-512。
+ 对于提取步骤：
  + 加密盐是一个 256 位的加密随机值。在[消息格式版本 2](message-format.md)（0x02）中，此值存储在 `MessageID` 字段中。
  + 初始加密材料是来自密钥环或主密钥提供程序的数据密钥。
+ 对于扩展步骤：
  + 输入伪随机密钥是提取步骤的输出。
  + 密钥标签是按大端字节顺序排列的 `DERIVEKEY` 字符串的 UTF-8 编码字节。
  + 输入信息是将算法 ID 和密钥标签（按此顺序）串联在一起的结果。
  + 输出加密材料的长度是**数据密钥长度**。该输出用作加密算法中的数据加密密钥。

**消息格式版本**  
算法套件中使用的消息格式的版本。有关更多信息，请参阅 [消息格式参考](message-format.md)。

**签名算法**  
用于在加密文字标头和正文上生成[数字签名](concepts.md#digital-sigs)的签名算法。 AWS Encryption SDK 使用椭圆曲线数字签名算法 (ECDSA)，具体细节如下：  
+ 使用的椭圆曲线是 P-384 或 P-256 曲线（由算法 ID 指定）。这些曲线是在[数字签名标准 (DSS) (FIPS PUB 186-4)](http://doi.org/10.6028/NIST.FIPS.186-4) 中定义的。
+ 使用的哈希函数是 SHA-384（具有 P-384 曲线）或 SHA-256（具有 P-256 曲线）。

# AWS Encryption SDK 初始化向量参考
<a name="IV-reference"></a>


|  | 
| --- |
|  本页面提供了在您构建与 AWS Encryption SDK兼容的加密库时可供参考的信息。如果您不需要构建自己的兼容加密库，则可能不需要此信息。 要 AWS Encryption SDK 在支持的编程语言之一中使用，请参阅[编程语言](programming-languages.md)。 有关定义适当 AWS Encryption SDK 实现要素的规范，请参阅中的[AWS Encryption SDK 规范](https://github.com/awslabs/aws-encryption-sdk-specification/) GitHub。  | 

 AWS Encryption SDK 提供所有支持的[算法套](algorithms-reference.md)件所需的[初始化向量](https://en.wikipedia.org/wiki/Initialization_vector) (IVs)。该开发工具包使用帧序列号构造一个 IV，以便同一消息中的两个帧不能具有相同的 IV。

每个 96 位（12 字节）IV 是通过两个按以下顺序串联的 big-endian 字节数组构造的：
+ 64 位：0（保留以供将来使用）
+ 32 位：帧序列号。对于标头身份验证标签，该值全部为零。

在引入[数据密钥缓存](data-key-caching.md)之前， AWS Encryption SDK 总是使用新的数据密钥来加密每条消息，而且所有消息都是 IVs随机生成的。随机生成的数据密钥 IVs 在密码学上是安全的，因为数据密钥从未被重复使用。当 SDK 引入数据密钥缓存（故意重复使用数据密钥）时，我们改变了 SDK 的生成 IVs方式。

使用不能在消息中重复的确定性 IVs 会显著增加在单个数据密钥下可以安全执行的调用次数。此外，缓存的数据密钥始终使用具有[密钥派生函数](https://en.wikipedia.org/wiki/Key_derivation_function)的算法套件。使用具有伪随机密钥派生函数的确定性 IV 从数据密钥派生加密密钥，可以在不超过加密边界的情况下加密 2^32 条消息。 AWS Encryption SDK 

# AWS KMS 分层钥匙圈技术细节
<a name="hierarchical-keyring-details"></a>

[AWS KMS 分层密钥环](use-hierarchical-keyring.md)使用唯一的数据密钥来加密每条消息，并使用源自活动分支密钥的唯一包装密钥对每个数据密钥进行加密。该技术使用计数器模式的[密钥派生](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-108r1.pdf)和带有 HMAC SHA-256 的伪随机函数，通过以下输入派生出 32 字节的包装密钥。
+ 一个 16 字节的随机加密盐
+ 活动分支密钥
+ 密钥提供程序标识符 “” aws-kms-hierarchy 的 [UTF-8 编码](https://en.wikipedia.org/wiki/UTF-8)值

分层密钥环使用派生的包装密钥，使用带有 16 字节身份验证标签和以下输入的 AES-GCM-256 对明文数据密钥的副本进行加密。
+ 派生的包装密钥用作 AES-GCM 密码密钥
+ 数据密钥用作 AES-GCM 消息
+ 使用 12 字节的随机初始化向量（IV）作为 AES-GCM IV
+ 包含以下序列化值的其他额外验证数据（AAD）。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/hierarchical-keyring-details.html)