

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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\_OAEP\_SHA\_\* 래핑 알고리즘과 같은 조합은 지원되지 않습니다.  
ECC\_NIST\_P521 키 구성 요소를 RSA\_2048 퍼블릭 래핑 키로 직접 래핑할 수는 없습니다. 더 큰 래핑 키나 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)할 때 지정한 동일한 래핑 알고리즘을 사용합니다. 지정한 래핑 알고리즘을 찾으려면 관련 [GetParametersForImport](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetParametersForImport.html) 요청에 대한 CloudTrail 로그 이벤트를 참조하세요.

## 테스트용 키 구성 요소 생성
<a name="importing-keys-example-key-material"></a>

다음 OpenSSL 명령은 테스트를 위해 지원되는 각 유형의 키 구성 요소를 생성합니다. 이러한 예시는 테스트 및 개념 증명 데모용으로만 제공됩니다. 프로덕션 시스템의 경우 보안이 보안 모듈이나 키 관리 시스템과 같은 보다 안전한 방법을 사용하여 키 구성 요소를 생성합니다.

비대칭 키 쌍의 프라이빗 키를 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\_OAEP\_SHA\_\* 래핑 알고리즘과 같은 조합은 지원되지 않습니다.  
ECC\_NIST\_P521 키 구성 요소를 RSA\_2048 퍼블릭 래핑 키로 직접 래핑할 수는 없습니다. 더 큰 래핑 키나 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 프라이빗 키에는 지원되지 않습니다. 또한 RSAES\_OAEP\_SHA\_\* 래핑 알고리즘과 함께 RSA\_2048 퍼블릭 래핑 키를 사용하여 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 는 대칭 암호화 키(SYMMETRIC\_DEFAULT), 타원 곡선(ECC) 프라이빗 키, SM2 프라이빗 키 및 HMAC 키에 대해 RSAES\_OAEP\_SHA\_256을 지원합니다.

RSAES\_OAEP\_SHA\_256은 RSA 프라이빗 키에는 지원되지 않습니다. 또한 RSAES\_OAEP\_SHA\_\* 래핑 알고리즘과 함께 RSA\_2048 퍼블릭 래핑 키를 사용하여 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 래핑 알고리즘에는 두 가지 암호화 작업이 포함됩니다.

1. 생성한 AES 대칭 키와 AES 대칭 암호화 알고리즘을 사용하여 키 구성 요소를 암호화합니다.

1. 다운로드한 퍼블릭 키와 RSAES\_OAEP\_SHA\_1 래핑 알고리즘을 사용하여 사용한 AES 대칭 키를 암호화합니다.

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 대칭 암호화 키를 암호화하고 DER 인코딩한 다음 `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 래핑 알고리즘에는 두 가지 암호화 작업이 포함됩니다.

1. 생성한 AES 대칭 키와 AES 대칭 암호화 알고리즘을 사용하여 키 구성 요소를 암호화합니다.

1. 다운로드한 퍼블릭 키와 RSAES\_OAEP\_SHA\_256 래핑 알고리즘을 사용하여 사용한 AES 대칭 키를 암호화합니다.

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 대칭 암호화 키를 암호화하고 DER 인코딩한 다음 `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)로 이동합니다.