

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

# 加密和解密功能
<a name="encryption-decryption-functions"></a>

加密和解密功能通过在可读的纯文本形式和不可读的密文形式之间进行转换，帮助 SQL 开发人员保护敏感数据免遭未经授权的访问或滥用。

AWS Clean Rooms Spark SQL 支持以下加密和解密功能：

**Topics**
+ [AES\$1加密功能](AES_ENCRYPT.md)
+ [AES\$1DECRYPT 函数](AES_DECRYPT.md)

# AES\$1加密功能
<a name="AES_ENCRYPT"></a>

AES\$1ENCRYPT 函数用于使用高级加密标准 (AES) 算法对数据进行加密。

## 语法
<a name="AES_ENCRYPT-syntax"></a>

```
aes_encrypt(expr, key[, mode[, padding[, iv[, aad]]]])
```

## 参数
<a name="AES_ENCRYPT-arguments"></a>

 *expr*   
要加密的二进制值。

 *密钥*   
用于加密数据的密码。  
支持 16、24 和 32 位的密钥长度。

 *mode*   
指定应使用哪种分组密码模式来加密消息。  
有效模式：ECB（电子 CodeBook）、GCM（伽罗瓦/计数器模式）、CBC（密码块链接）。

 *填充*   
指定如何填充长度不是区块大小的倍数的消息。  
有效值：PKCS、无、默认。  
默认填充表示欧洲央行的 PKCS（公钥加密标准），GCM 为 NONE，CBC 为 PKCS。  
支持的（*模式*、*填充）组合是（'ECB'、'P* KCS'）、（'GCM'、'NONE'）和（'CBC'、'PKCS'）。

 *iv*   
可选的初始化向量 (IV)。仅支持 CBC 和 GCM 模式。  
有效值：GCM 长度为 12 字节，CBC 为 16 字节。

 *aad*   
可选的其他经过身份验证的数据 (AAD)。仅支持 GCM 模式。这可以是任何自由格式的输入，并且必须同时用于加密和解密。

## 返回类型
<a name="AES_ENCRYPT-returm-type"></a>

AES\$1ENCRYPT 函数在给定模式下使用 AES 返回带有指定填充的 e *xpr* 的加密值。

## 示例
<a name="AES_ENCRYPT-example"></a>

以下示例演示如何使用 Spark SQL AES\$1ENCRYPT 函数使用指定的加密密钥安全地加密一串数据（在本例中为 “Spark” 一词）。然后对生成的密文进行 Base64 编码，使其更易于存储或传输。

```
SELECT base64(aes_encrypt('Spark', 'abcdefghijklmnop'));
  4A5jOAh9FNGwoMeuJukfllrLdHEZxA2DyuSQAWz77dfn
```

以下示例演示如何使用 Spark SQL AES\$1ENCRYPT 函数使用指定的加密密钥安全地加密一串数据（在本例中为 “Spark” 一词）。然后，生成的密文以十六进制格式表示，这对于数据存储、传输或调试等任务非常有用。

```
SELECT hex(aes_encrypt('Spark', '0000111122223333'));
 83F16B2AA704794132802D248E6BFD4E380078182D1544813898AC97E709B28A94
```

以下示例演示如何使用 Spark SQL AES\$1ENCRYPT 函数使用指定的加密密钥、加密模式和填充模式安全地加密一串数据（在本例中为 “Spark SQL”）。然后对生成的密文进行 Base64 编码，使其更易于存储或传输。

```
SELECT base64(aes_encrypt('Spark SQL', '1234567890abcdef', 'ECB', 'PKCS'));
 3lmwu+Mw0H3fi5NDvcu9lg==
```

# AES\$1DECRYPT 函数
<a name="AES_DECRYPT"></a>

AES\$1DECRYPT 函数用于使用高级加密标准 (AES) 算法解密数据。

## 语法
<a name="AES_DECRYPT-syntax"></a>

```
aes_decrypt(expr, key[, mode[, padding[, aad]]])
```

## 参数
<a name="AES_DECRYPT-arguments"></a>

 *expr*   
要解密的二进制值。

 *密钥*   
用于解密数据的密码。  
密码必须与最初用于生成加密值的密钥相匹配，并且长度必须为 16、24 或 32 字节。

 *mode*   
指定应使用哪种分组密码模式来解密消息。  
有效模式：ECB、GCM、CBC。

 *填充*   
指定如何填充长度不是区块大小的倍数的消息。  
有效值：PKCS、无、默认。  
默认填充表示欧洲央行的 PKCS、GCM 的 NONE 和 CBC 的 PKCS。

 *aad*   
可选的其他经过身份验证的数据 (AAD)。仅支持 GCM 模式。这可以是任何自由格式的输入，并且必须同时用于加密和解密。

## 返回类型
<a name="AES_DECRYPT-return-type"></a>

在带填充的模式下使用 AES 返回解密后的 e *xpr* 值。

## 示例
<a name="AES_DECRYPT-examples"></a>

以下示例演示如何使用 Spark SQL AES\$1ENCRYPT 函数使用指定的加密密钥安全地加密一串数据（在本例中为 “Spark” 一词）。然后对生成的密文进行 Base64 编码，使其更易于存储或传输。

```
SELECT base64(aes_encrypt('Spark', 'abcdefghijklmnop'));
  4A5jOAh9FNGwoMeuJukfllrLdHEZxA2DyuSQAWz77dfn
```

以下示例演示了如何使用 Spark SQL AES\$1DECRYPT 函数来解密之前已加密和 Base64 编码的数据。解密过程需要正确的加密密钥和参数（加密模式和填充模式）才能成功恢复原始纯文本数据。

```
SELECT aes_decrypt(unbase64('3lmwu+Mw0H3fi5NDvcu9lg=='), '1234567890abcdef', 'ECB', 'PKCS');
 Spark SQL
```