

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

# 步驟 3：加密金鑰材料
<a name="importing-keys-encrypt-key-material"></a>

在您[下載公有金鑰和匯入字符](importing-keys-get-public-key-and-token.md)之後，請使用您下載的公有金鑰與您指定的包裝演算法來加密金鑰資料。如果您需要替換公有金鑰或匯入字符，或要變更包裝算法，則必須下載新的公有金鑰和匯入字符。如需 AWS KMS 支援的公有金鑰和包裝演算法的相關資訊，請參閱 [選取包裝公有金鑰規格](importing-keys-get-public-key-and-token.md#select-wrapping-key-spec)和 [選取包裝演算法](importing-keys-get-public-key-and-token.md#select-wrapping-algorithm)。

金鑰材料必須是二進位格式。如需詳細資訊，請參閱 [匯入金鑰資料需求](importing-keys-conceptual.md#importing-keys-material-requirements)。

**注意**  
對於非對稱金鑰對，請僅加密和匯入私有金鑰。 會從私有金鑰 AWS KMS 衍生公有金鑰。  
不支援下列組合：ECC\_NIST\_P521 金鑰資料、RSA\_2048 公有包裝金鑰規格以及 RSAES\_OAE\_SHA\_\* 包裝演算法。  
您無法使用 RSA\_2048 公有包裝金鑰直接包裝 ECC\_NIST\_P521 金鑰材質。使用較大的包裝金鑰或 RSA\_AES\_KEY\_WRAP\_SHA\_\* 包裝演算法。  
中國區域不支援 RSA\_AES\_KEY\_WRAP\_SHA\_256 和 RSA\_AES\_KEY\_WRAP\_SHA\_1 包裝演算法。

一般而言，當您從硬體安全模組 (HSM) 或金鑰管理系統匯出金鑰材料，您會將其加密。如需如何以二進位格式匯出金鑰材料的詳細資訊，請參閱您的 HSM 或金鑰管理系統的文件。您也可以參閱以下章節，其中提供使用 OpenSSL 的概念驗證示範。

當加密金鑰資料時，請使用您在[下載包裝公有金鑰與匯入字符](importing-keys-get-public-key-and-token.md)時所指定的包裝演算法。若要尋找您指定的包裝演算法，請參閱 CloudTrail 日誌事件，以瞭解關聯的 [GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html) 要求。

## 產生用於測試的金鑰資料
<a name="importing-keys-example-key-material"></a>

下列 OpenSSL 指令會產生每種受支援類型的金鑰資料以供測試。這些範例僅供測試與概念驗證示範之用。對於生產系統，請使用更安全方法 (例如商業 HSM 或金鑰管理系統) 來產生並存放您的金鑰資料。

若要將非對稱金鑰配對的私有金鑰轉換為 DER 編碼格式，請將金鑰資料產生命令傳輸至下列 `openssl pkcs8` 命令。此 `topk8` 參數會指示 OpenSSL 取得私有金鑰做為匯入，並傳回 PKCS \#8 格式化的金鑰。(預設行為是相反。) 

```
openssl pkcs8 -topk8 -outform der -nocrypt
```

下列命令會為每個受支援的金鑰類型產生測試金鑰資料。
+ 對稱加密金鑰 (32 位元組)

  此命令會產生 256 位元對稱金鑰 (32 位元組隨機字串)，並將其儲存在 `PlaintextKeyMaterial.bin` 檔案。您不需要對此金鑰資料進行編碼。

  ```
  openssl rand -out PlaintextKeyMaterial.bin 32
  ```

  僅在中國區域，您必須產生 128 位元對稱金鑰 (16 位元組隨機字串)。

  ```
  openssl rand -out PlaintextKeyMaterial.bin 16
  ```
+ HMAC 金鑰

  此命令產生指定大小的隨機位元組字串。您不需要對此金鑰資料進行編碼。

  HMAC 金鑰的長度必須符合 KMS 金鑰規格所定義的長度。例如，如果 KMS 金鑰是 HMAC\_384，您必須匯入 384 位元 (48 位元組) 金鑰。

  ```
  openssl rand -out HMAC_224_PlaintextKey.bin 28
  
  openssl rand -out HMAC_256_PlaintextKey.bin 32
  
  openssl rand -out HMAC_384_PlaintextKey.bin 48
  
  openssl rand -out HMAC_512_PlaintextKey.bin 64
  ```
+ RSA 私有金鑰

  ```
  openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_2048_PrivateKey.der
  
  openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:3072 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_3072_PrivateKey.der
  
  openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_4096_PrivateKey.der
  ```
+ ECC 私有金鑰

  ```
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P256_PrivateKey.der
  
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-384 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P384_PrivateKey.der
  
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-521 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P521_PrivateKey.der
  
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:secp256k1 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_SECG_P256K1_PrivateKey.der
  ```
+ SM2 私有金鑰 （僅限中國區域）

  ```
  openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:sm2 | openssl pkcs8 -topk8 -outform der -nocrypt > SM2_PrivateKey.der
  ```

## 範例：使用 OpenSSL 加密金鑰資料
<a name="importing-keys-encrypt-key-material-openssl"></a>

下列範例說明如何使用 [OpenSSL](https://openssl.org/) 以下載的公有金鑰來加密金鑰內容。若要使用 SM2 公有金鑰加密金鑰材料 （僅限中國區域），請使用 [`SM2OfflineOperationHelper`類別](offline-operations.md#key-spec-sm-offline-helper)。如需每個包裝演算法支援的金鑰材料類型的詳細資訊，請參閱 [選取包裝演算法](importing-keys-get-public-key-and-token.md#select-wrapping-algorithm)。

**重要**  
此範例僅為概念驗證示範。對於生產系統，請使用更安全方法 (例如商業 HSM 或金鑰管理系統) 來產生和存放您的金鑰材料。  
不支援下列組合：ECC\_NIST\_P521 金鑰資料、RSA\_2048 公有包裝金鑰規格以及 RSAES\_OAE\_SHA\_\* 包裝演算法。  
您無法使用 RSA\_2048 公有包裝金鑰直接包裝 ECC\_NIST\_P521 金鑰材質。使用較大的包裝金鑰或 RSA\_AES\_KEY\_WRAP\_SHA\_\* 包裝演算法。

------
#### [ RSAES\_OAEP\_SHA\_1 ]

AWS KMS 支援對稱加密金鑰 (SYMMETRIC\_DEFAULT)、橢圓曲線 (ECC) 私有金鑰、SM2 私有金鑰和 HMAC 金鑰的 RSAES\_OAEP\_SHA\_1。

RSAES\_OAEP\_SHA\_1 不支援 RSA 私有金鑰。此外，您不能將 RSA\_2048 公有包裝金鑰與任何 RSAES\_OAEP\_SHA\_\* 包裝演算法搭配使用，來包裝 ECC\_NIST\_P521 (secp521r1) 私有金鑰。您必須使用較大的公有包裝金鑰或 RSA\_AES\_KEY\_WRAP 包裝演算法。

下列範例會使用[您下載的公有金鑰](importing-keys-get-public-key-and-token.md)與 RSAES\_OAEP\_SHA\_1 包裝演算法來加密金鑰資料，並將其儲存在 `EncryptedKeyMaterial.bin` 檔案。

在此範例中：
+ {{`WrappingPublicKey.bin`}} 是包含下載的包裝公有金鑰的檔案。
+ {{`PlaintextKeyMaterial.bin`}} 是包含您正在加密的金鑰資料的檔案，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin` 或 `ECC_NIST_P521_PrivateKey.der`。

```
$ openssl pkeyutl \
    -encrypt \
    -in {{PlaintextKeyMaterial.bin}} \
    -out EncryptedKeyMaterial.bin \
    -inkey {{WrappingPublicKey.bin}} \
    -keyform DER \
    -pubin \
    -pkeyopt rsa_padding_mode:oaep \
    -pkeyopt rsa_oaep_md:sha1
```

------
#### [ RSAES\_OAEP\_SHA\_256 ]

AWS KMS 支援 RSAES\_OAEP\_SHA\_256 的對稱加密金鑰 (SYMMETRIC\_DEFAULT)、橢圓曲線 (ECC) 私有金鑰、SM2 私有金鑰和 HMAC 金鑰。

RSAES\_OAEP\_SHA\_256 不支援 RSA 私有金鑰。此外，您不能將 RSA\_2048 公有包裝金鑰與任何 RSAES\_OAEP\_SHA\_\* 包裝演算法搭配使用，來包裝 ECC\_NIST\_P521 (secp521r1) 私有金鑰。您必須使用較大的公有金鑰或 RSA\_AES\_KEY\_WRAP 包裝演算法。

下列範例會使用[您下載的公有金鑰](importing-keys-get-public-key-and-token.md)與 RSAES\_OAEP\_SHA\_256 包裝演算法來加密金鑰資料，並將其儲存在 `EncryptedKeyMaterial.bin` 檔案。

在此範例中：
+ {{`WrappingPublicKey.bin`}} 是包含下載的公有包裝金鑰的檔案。如果從主控台下載公有金鑰，這個檔案名稱為 `wrappingKey_{{KMS key_key_ID}}_{{timestamp}}` (例如 `wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909`)。
+ {{`PlaintextKeyMaterial.bin`}} 是包含您正在加密金鑰資料的檔案，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin` 或 `ECC_NIST_P521_PrivateKey.der`。

```
$ openssl pkeyutl \
    -encrypt \
    -in {{PlaintextKeyMaterial.bin}} \
    -out EncryptedKeyMaterial.bin \
    -inkey {{WrappingPublicKey.bin}} \
    -keyform DER \
    -pubin \
    -pkeyopt rsa_padding_mode:oaep \
    -pkeyopt rsa_oaep_md:sha256 \
    -pkeyopt rsa_mgf1_md:sha256
```

------
#### [ RSA\_AES\_KEY\_WRAP\_SHA\_1 ]

此 RSA\_AES\_KEY\_WRAP\_SHA\_1 RSA 包裝演算法涉及兩個加密操作。

1. 使用您產生的 AES 對稱金鑰與 AES 對稱加密演算法來加密金鑰資料。

1. 將您所下載的公有金鑰與 RSAES\_OAEP\_SHA\_1 包裝演算法搭配使用的 AES 對稱金鑰加密。

The RSA\_AES\_KEY\_WRAP\_SHA\_1 包裝演算法需要 OpenSSL 版本 3。*x* 或更新版本。

1. 

**產生 256 位元 AES 對稱加密金鑰**

   此命令會產生由 256 個隨機位元組成的 AES 對稱加密金鑰，並將其儲存在 `aes-key.bin` 檔案

   ```
   # Generate a 32-byte AES symmetric encryption key
   $ openssl rand -out aes-key.bin 32
   ```

1. 

**使用 AES 對稱加密金鑰加密您的金鑰資料**

   此命令會使用 AES 對稱加密金鑰加密金鑰，並將加密的金鑰資料儲存在 `key-material-wrapped.bin` 檔案。

   以下是範例命令：
   + {{`PlaintextKeyMaterial.bin`}} 是包含您要匯入金鑰資料的檔案，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin`、`RSA_3072_PrivateKey.der` 或 `ECC_NIST_P521_PrivateKey.der`。
   + {{`aes-key.bin`}} 是包含您在上一個命令中產生的 256 位元 AES 對稱加密金鑰的檔案。

   ```
   # Encrypt your key material with the AES symmetric encryption key
   $ openssl enc -id-aes256-wrap-pad \
           -K "$(xxd -p < {{aes-key.bin}} | tr -d '\n')" \
           -iv A65959A6 \
           -in {{PlaintextKeyMaterial.bin}} \
           -out key-material-wrapped.bin
   ```

1. 

**使用公有金鑰加密 AES 對稱加密金鑰**

   此命令使用您下載的公有金鑰與 RSAES\_OAEP\_SHA\_1 包裝演算法對您的 AES 對稱加密金鑰進行加密，並將其保存在 `aes-key-wrapped.bin` 檔案。

   以下是範例命令：
   + {{`WrappingPublicKey.bin`}} 是包含下載的公有包裝金鑰的檔案。如果從主控台下載公有金鑰，此檔案名稱為 `wrappingKey_{{KMS key_key_ID}}_{{timestamp}}` (例如 `wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909`)。
   + {{`aes-key.bin`}} 是包含您在此範例序列的第一個命令所產生的 256 位元 AES 對稱加密金鑰的檔案。

   ```
   # Encrypt your AES symmetric encryption key with the downloaded public key
   $ openssl pkeyutl \
       -encrypt \
       -in {{aes-key.bin}} \
       -out aes-key-wrapped.bin \
       -inkey {{WrappingPublicKey.bin}} \
       -keyform DER \
       -pubin \
       -pkeyopt rsa_padding_mode:oaep \
       -pkeyopt rsa_oaep_md:sha1 \
       -pkeyopt rsa_mgf1_md:sha1
   ```

1. 

**產生要匯入的檔案**

   將檔案與加密的金鑰資料及檔案與加密的 AES 金鑰連接起來。將它們儲存在 `EncryptedKeyMaterial.bin` 檔案，這是您將匯入在 [步驟 4：匯入金鑰材料](importing-keys-import-key-material.md) 檔案 。

   以下是範例命令：
   + {{`key-material-wrapped.bin`}} 是包含加密金鑰資料的檔案。
   + {{`aes-key-wrapped.bin`}} 是包含加密 AES 加密金鑰的檔案。

   ```
   # Combine the encrypted AES key and encrypted key material in a file
   $ cat {{aes-key-wrapped.bin}} {{key-material-wrapped.bin}} > {{EncryptedKeyMaterial.bin}}
   ```

------
#### [ RSA\_AES\_KEY\_WRAP\_SHA\_256 ]

此 RSA\_AES\_KEY\_WRAP\_SHA\_256 RSA 包裝演算法涉及兩個加密操作。

1. 使用您產生的 AES 對稱金鑰與 AES 對稱加密演算法來加密金鑰資料。

1. 將您所下載的公有金鑰與 RSAES\_OAEP\_SHA\_256 包裝演算法搭配使用的 AES 對稱金鑰加密。

The RSA\_AES\_KEY\_WRAP\_SHA\_256 包裝演算法需要 OpenSSL 版本 3。*x* 或更新版本。

1. 

**產生 256 位元 AES 對稱加密金鑰**

   此命令會產生由 256 個隨機位元組成的 AES 對稱加密金鑰，並將其儲存在 `aes-key.bin` 檔案

   ```
   # Generate a 32-byte AES symmetric encryption key
   $ openssl rand -out aes-key.bin 32
   ```

1. 

**使用 AES 對稱加密金鑰加密您的金鑰資料**

   此命令會使用 AES 對稱加密金鑰加密金鑰，並將加密的金鑰資料儲存在 `key-material-wrapped.bin` 檔案。

   以下是範例命令：
   + {{`PlaintextKeyMaterial.bin`}} 是包含您要匯入金鑰資料的檔案，例如 `PlaintextKeyMaterial.bin`、`HMAC_384_PlaintextKey.bin`、`RSA_3072_PrivateKey.der` 或 `ECC_NIST_P521_PrivateKey.der`。
   + {{`aes-key.bin`}} 是包含您在上一個命令中產生的 256 位元 AES 對稱加密金鑰的檔案。

   ```
   # Encrypt your key material with the AES symmetric encryption key
   $ openssl enc -id-aes256-wrap-pad \
           -K "$(xxd -p < {{aes-key.bin}} | tr -d '\n')" \
           -iv A65959A6 \
           -in {{PlaintextKeyMaterial.bin}} \
           -out key-material-wrapped.bin
   ```

1. 

**使用公有金鑰加密 AES 對稱加密金鑰**

   此命令使用您下載的公有金鑰與 RSAES\_OAEP\_SHA\_256 包裝演算法對您的 AES 對稱加密金鑰進行加密，並將其保存在 `aes-key-wrapped.bin` 檔案。

   以下是範例命令：
   + {{`WrappingPublicKey.bin`}} 是包含下載的公有包裝金鑰的檔案。如果從主控台下載公有金鑰，此檔案名稱為 `wrappingKey_{{KMS key_key_ID}}_{{timestamp}}` (例如 `wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909`)。
   + {{`aes-key.bin`}} 是包含您在此範例序列的第一個命令所產生的 256 位元 AES 對稱加密金鑰的檔案。

   ```
   # Encrypt your AES symmetric encryption key with the downloaded public key
   $ openssl pkeyutl \
       -encrypt \
       -in {{aes-key.bin}} \
       -out aes-key-wrapped.bin \
       -inkey {{WrappingPublicKey.bin}} \
       -keyform DER \
       -pubin \
       -pkeyopt rsa_padding_mode:oaep \
       -pkeyopt rsa_oaep_md:sha256 \
       -pkeyopt rsa_mgf1_md:sha256
   ```

1. 

**產生要匯入的檔案**

   將檔案與加密的金鑰資料及檔案與加密的 AES 金鑰連接起來。將它們儲存在 `EncryptedKeyMaterial.bin` 檔案，這是您將匯入在 [步驟 4：匯入金鑰材料](importing-keys-import-key-material.md) 檔案 。

   以下是範例命令：
   + {{`key-material-wrapped.bin`}} 是包含加密金鑰資料的檔案。
   + {{`aes-key-wrapped.bin`}} 是包含加密 AES 加密金鑰的檔案。

   ```
   # Combine the encrypted AES key and encrypted key material in a file
   $ cat {{aes-key-wrapped.bin}} {{key-material-wrapped.bin}} > {{EncryptedKeyMaterial.bin}}
   ```

------

繼續執行「[步驟 4：匯入金鑰材料](importing-keys-import-key-material.md)」。