

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

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

加密和解密函數可協助 SQL 開發人員在可讀取的純文字形式和不可讀取的加密文字形式之間轉換敏感資料，以防止未經授權的存取或濫用。

AWS Clean Rooms Spark SQL 支援下列加密和解密函數：

**Topics**
+ [AES\$1ENCRYPT 函數](AES_ENCRYPT.md)
+ [AES\$1DECRYPT 函數](AES_DECRYPT.md)

# AES\$1ENCRYPT 函數
<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 位元的金鑰長度。

 *模式*   
指定應使用哪個區塊加密模式來加密訊息。  
有效模式：ECB （電子 CodeBook)、GCM (Galois/Counter 模式）、CBC (Cipher-Block Chaining)。

 *填補*   
指定如何填補長度不是區塊大小倍數的訊息。  
有效值：PKCS、NONE、DEFAULT。  
DEFAULT 填補表示適用於 ECB 的 PKCS （公有金鑰密碼編譯標準）、適用於 GCM 的 NONE 和適用於 CBC 的 PKCS。  
支援的 (*模式*、*填充*) 組合為 ('ECB'、'PKCS')、 ('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 傳回 *expr* 的加密值，並指定填充。

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

下列範例示範如何使用 Spark SQL AES\$1ENCRYPT 函數，使用指定的加密金鑰安全地加密資料字串 （在此案例中為「Spark」一詞）。產生的加密文字接著會經過 Base64-encoded，以便更輕鬆地儲存或傳輸。

```
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-encoded，以便更輕鬆地儲存或傳輸。

```
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 個位元組。

 *模式*   
指定應使用哪個區塊加密模式來解密訊息。  
有效模式：ECB、GCM、CBC。

 *填補*   
指定如何填補長度不是區塊大小倍數的訊息。  
有效值：PKCS、NONE、DEFAULT。  
DEFAULT 填補表示適用於 ECB 的 PKCS、適用於 GCM 的 NONE 和適用於 CBC 的 PKCS。

 *aad*   
選用的其他已驗證資料 (AAD)。僅支援 GCM 模式。這可以是任何自由格式的輸入，而且必須同時提供加密和解密。

## 傳回類型
<a name="AES_DECRYPT-return-type"></a>

在 模式中使用 AES 搭配填充，傳回 *expr* 的解密值。

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

下列範例示範如何使用 Spark SQL AES\$1ENCRYPT 函數，使用指定的加密金鑰安全地加密資料字串 （在此案例中為「Spark」一詞）。產生的加密文字接著會經過 Base64-encoded，以便更輕鬆地儲存或傳輸。

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

下列範例示範如何使用 Spark SQL AES\$1DECRYPT 函數來解密先前已加密和 Base64-encoded的資料。解密程序需要正確的加密金鑰和參數 （加密模式和填補模式），才能成功復原原始純文字資料。

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