

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

# 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 曲线）。