

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Encryption AWS CLI の例
<a name="crypto-cli-examples"></a>

次の例を使用して、希望するプラットフォームで AWS Encryption CLI を試します。マスターキーおよびその他のパラメータのヘルプについては、「[Encryption AWS CLI の使用方法](crypto-cli-how-to.md)」を参照してください。クイックリファレンスについては、「[AWS Encryption SDK CLI 構文とパラメータリファレンス](crypto-cli-reference.md)」を参照してください。

**注記**  
次の例では、Encryption CLI AWS バージョン 2.1.*x* の構文を使用します。  
新しいセキュリティ機能は、もともと AWS Encryption CLI バージョン 1.7.*x* および 2.0.*x* でリリースされました。ただし、 AWS Encryption CLI バージョン 1.8.*x* はバージョン 1.7.*x* AWS に置き換わり、Encryption CLI 2.1.*x* は 2.0.*x* に置き換わります。詳細については、GitHub の [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/) リポジトリで関連する[セキュリティアドバイザリ](https://github.com/aws/aws-encryption-sdk-cli/security/advisories/GHSA-2xwp-m7mq-7q3r)を参照してください。

暗号化されたデータキーを制限するセキュリティ機能の使用方法の例については、「[暗号化されたデータキーの制限](configure.md#config-limit-keys)」を参照してください。

 AWS KMS マルチリージョンキーの使用方法を示す例については、「」を参照してください[マルチリージョンの使用 AWS KMS keys](configure.md#config-mrks)。

**Topics**
+ [ファイルの暗号化](#cli-example-encrypt-file)
+ [ファイルの復号](#cli-example-decrypt-file)
+ [ディレクトリ内のすべてのファイルの暗号化](#cli-example-encrypt-directory)
+ [ディレクトリ内のすべてのファイルの復号](#cli-example-decrypt-directory)
+ [コマンドラインでの暗号化と復号](#cli-example-stdin)
+ [複数のマスターキーの使用](#cli-example-multimaster)
+ [スクリプトでの暗号化と復号](#cli-example-script)
+ [データキーキャッシュの使用](#cli-example-caching)

## ファイルの暗号化
<a name="cli-example-encrypt-file"></a>

この例では AWS 、Encryption CLI を使用して、「Hello World」文字列を含む`hello.txt`ファイルの内容を暗号化します。

ファイルで暗号化コマンドを実行すると、 AWS Encryption CLI はファイルの内容を取得し、一意の[データキー](concepts.md#DEK)を生成し、データキーの下のファイル内容を暗号化してから、[暗号化されたメッセージを](concepts.md#message)新しいファイルに書き込みます。

最初のコマンドは、 のキー ARN を `$keyArn`変数 AWS KMS key に保存します。で暗号化する場合 AWS KMS key、キー ID、キー ARN、エイリアス名、またはエイリアス ARN を使用して識別できます。のキー識別子の詳細については AWS KMS key、「 *AWS Key Management Service デベロッパーガイド*」の[「キー識別子](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)」を参照してください。

2 番目のコマンドは、ファイルの内容を暗号化します。コマンドは `--encrypt` パラメータを使用してオペレーションを指定し、`--input` パラメータを使用して暗号化するファイルを指定します。[`--wrapping-keys` パラメータ](crypto-cli-how-to.md#crypto-cli-master-key)とその必須の **key** 属性は、キー ARN で AWS KMS key 表される を使用するように コマンドに指示します。

このコマンドは `--metadata-output` パラメータを使用して、暗号化オペレーションに関するメタデータのテキストファイルを指定します。ベストプラクティスとして、このコマンドは `--encryption-context` パラメータを使用して[暗号化コンテキスト](crypto-cli-how-to.md#crypto-cli-encryption-context)を指定します。

このコマンドでは、[`--commitment-policy` パラメータ](crypto-cli-reference.md#syntax-commitment-policy)も使用してコミットメントポリシーを明示的に設定します。バージョン 1.8.*x* では、`--wrapping-keys` パラメータを使用するときにこのパラメータが必要です。バージョン 2.1.*x* 以降では、`--commitment-policy` パラメータはオプションですが推奨されます。

`--output` パラメータの値のドット (.) は、出力ファイルを現在のディレクトリに書き込むようコマンドに指示します。

------
#### [ Bash ]

```
\\ To run this example, replace the fictitious key ARN with a valid value.
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

$ aws-encryption-cli --encrypt \
                     --input hello.txt \
                     --wrapping-keys key=$keyArn \
                     --metadata-output ~/metadata \
                     --encryption-context purpose=test \
                     --commitment-policy require-encrypt-require-decrypt \
                     --output .
```

------
#### [ PowerShell ]

```
# To run this example, replace the fictitious key ARN with a valid value.
PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

PS C:\> aws-encryption-cli --encrypt `
                           --input Hello.txt `
                           --wrapping-keys key=$keyArn `
                           --metadata-output $home\Metadata.txt `
                           --commitment-policy require-encrypt-require-decrypt `
                           --encryption-context purpose=test `
                           --output .
```

------

暗号化コマンドが成功した場合、出力を返しません。コマンドが成功したかどうかを確認するには、`$?` 変数のブール値をチェックします。コマンドが成功した場合、`$?` の値は `0` (Bash) または `True` (PowerShell) です。コマンドが失敗した場合、`$?` の値は 0 以外 (Bash) または `False` (PowerShell) です。

------
#### [ Bash ]

```
$ echo $?
0
```

------
#### [ PowerShell ]

```
PS C:\> $?
True
```

------

また、ディレクトリ一覧コマンドを使用して、暗号化コマンドが新しいファイル `hello.txt.encrypted` を作成したかどうかを確認することもできます。encrypt コマンドは出力のファイル名を指定しなかったため、Encryption CLI AWS は入力ファイルと同じ名前と`.encrypted`サフィックスを持つファイルに出力を書き込みました。別のサフィックスを使用するか、サフィックスを抑制するには、`--suffix` パラメータを使用します。

`hello.txt.encrypted` ファイルには、[暗号化メッセージ](concepts.md#message)が含まれています。それには、`hello.txt` ファイルの暗号テキスト、データキーの暗号化コピー、および暗号化コンテキストを含む追加のメタデータが含まれています。

------
#### [ Bash ]

```
$  ls
hello.txt  hello.txt.encrypted
```

------
#### [ PowerShell ]

```
PS C:\> dir

    Directory: C:\TestCLI

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/15/2017   5:57 PM             11 Hello.txt
-a----        9/17/2017   1:06 PM            585 Hello.txt.encrypted
```

------

## ファイルの復号
<a name="cli-example-decrypt-file"></a>

この例では、Encryption AWS CLI を使用して、前の例で暗号化された`Hello.txt.encrypted`ファイルの内容を復号します。

復号コマンドは `--decrypt` パラメータを使用してオペレーションを指定し、`--input` パラメータを使用して復号するファイルを指定します。`--output` パラメータの値は、現在のディレクトリを表すドットです。

**key** 属性を含む `--wrapping-keys` パラメータでは、暗号化されたメッセージの復号に使用するラッピングキーを指定します。を使用した復号コマンドでは AWS KMS keys、key 属性の値は[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) である必要があります。復号コマンドには `--wrapping-keys` パラメータが必要です。 AWS KMS keysを使用している場合は、**key** 属性を使用して復号用の AWS KMS keys を指定するか、**discovery** 属性を `true` にします (両方ではない)。カスタムマスターキープロバイダーを使用している場合、**key** 属性と **provider** 属性は必須です。

バージョン 2.1.x 以降では、[`--commitment-policy` パラメータ](crypto-cli-reference.md#syntax-commitment-policy)はオプションですが推奨されます。明示的に使用すると、デフォルト値 `require-encrypt-require-decrypt` を指定した場合でも、意図が明確になります。

`--encryption-context` パラメータは、暗号化コマンドで[暗号化コンテキスト](crypto-cli-how-to.md#crypto-cli-encryption-context)が指定されている場合でも、復号コマンドではオプションです。この場合、復号コマンドは暗号化コマンドで提供されたものと同じ暗号化コンテキストを使用します。暗号化 CLI AWS は、復号する前に、暗号化されたメッセージの暗号化コンテキストに`purpose=test`ペアが含まれていることを確認します。そうでない場合、復号コマンドは失敗します。

`--metadata-output` パラメータは、復号オペレーションに関するメタデータのファイルを指定します。`--output` パラメータの値のドット (.) は、出力ファイルを現在のディレクトリに書き込みます。

ベストプラクティスとして、`--max-encrypted-data-keys` パラメータを使用して、暗号化されたデータキーの数が多すぎる不正な形式のメッセージの復号化を回避してください。暗号化されたデータキーの予想数 (暗号化で使用されるラッピングキーごとに 1 つ)、または適切な最大値 (5 など) を指定します。詳細については、「[暗号化されたデータキーの制限](configure.md#config-limit-keys)」を参照してください。

`--buffer` では、デジタル署名が存在する場合の検証も含めて、すべての入力が処理された後にのみプレーンテキストが返されます。

------
#### [ Bash ]

```
\\ To run this example, replace the fictitious key ARN with a valid value.
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

$ aws-encryption-cli --decrypt \
                     --input hello.txt.encrypted \
                     --wrapping-keys key=$keyArn \
                     --commitment-policy require-encrypt-require-decrypt \
                     --encryption-context purpose=test \
                     --metadata-output ~/metadata \
                     --max-encrypted-data-keys 1 \
                     --buffer \
                     --output .
```

------
#### [ PowerShell ]

```
\\ To run this example, replace the fictitious key ARN with a valid value.
PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

PS C:\> aws-encryption-cli --decrypt `
                           --input Hello.txt.encrypted `
                           --wrapping-keys key=$keyArn `
                           --commitment-policy require-encrypt-require-decrypt `
                           --encryption-context purpose=test `
                           --metadata-output $home\Metadata.txt `
                           --max-encrypted-data-keys 1 `
                           --buffer `
                           --output .
```

------

復号コマンドが成功した場合、出力を返しません。コマンドが成功したかどうかを確認するには、`$?` 変数の値を取得します。また、ディレクトリ一覧コマンドを使用して、コマンドが `.decrypted` サフィックスが付加された新しいファイルを作成したかどうかを確認することもできます。プレーンテキストコンテンツを表示するには、ファイルコンテンツを取得するコマンドの `cat` や [Get-Content](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content) などを使用します。

------
#### [ Bash ]

```
$  ls
hello.txt  hello.txt.encrypted  hello.txt.encrypted.decrypted

$  cat hello.txt.encrypted.decrypted
Hello World
```

------
#### [ PowerShell ]

```
PS C:\> dir

    Directory: C:\TestCLI

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/17/2017   1:01 PM             11 Hello.txt
-a----        9/17/2017   1:06 PM            585 Hello.txt.encrypted
-a----        9/17/2017   1:08 PM             11 Hello.txt.encrypted.decrypted


PS C:\> Get-Content Hello.txt.encrypted.decrypted
Hello World
```

------

## ディレクトリ内のすべてのファイルの暗号化
<a name="cli-example-encrypt-directory"></a>

この例では、Encryption AWS CLI を使用して、ディレクトリ内のすべてのファイルの内容を暗号化します。

コマンドが複数のファイルに影響を与えると、Encryption AWS CLI は各ファイルを個別に処理します。コマンドはファイルの内容を取得し、マスターキーからファイルの一意の[データキー](concepts.md#DEK)を取得し、データキーでファイルの内容を暗号化して、結果を出力ディレクトリの新しいファイルに書き込みます。その結果、出力ファイルを個別に復号することができます。

`TestDir` ディレクトリのこのリストには、暗号化するプレーンテキストファイルが表示されています。

------
#### [ Bash ]

```
$  ls testdir
cool-new-thing.py  hello.txt  employees.csv
```

------
#### [ PowerShell ]

```
PS C:\> dir C:\TestDir

    Directory: C:\TestDir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/12/2017   3:11 PM           2139 cool-new-thing.py
-a----        9/15/2017   5:57 PM             11 Hello.txt
-a----        9/17/2017   1:44 PM             46 Employees.csv
```

------

最初のコマンドは、 の [Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn) を `$keyArn`変数 AWS KMS key に保存します。

2 番目のコマンドは、`TestDir` ディレクトリ内のファイルのコンテンツを暗号化し、暗号化されたコンテンツのファイルを `TestEnc` ディレクトリに書き込みます。`TestEnc` ディレクトリが存在しない場合、コマンドは失敗します。入力場所はディレクトリのため、`--recursive` パラメータが必要です。

[`--wrapping-keys` パラメータ](crypto-cli-how-to.md#crypto-cli-master-key)とその必須の **key** 属性は、使用するラッピングキーを指定します。暗号化コマンドには[暗号化コンテキスト](crypto-cli-how-to.md#crypto-cli-encryption-context)、`dept=IT` が含まれています。複数のファイルを暗号化するコマンドに暗号化コンテキストを指定すると、すべてのファイルで同じ暗号化コンテキストが使用されます。

コマンドには、暗号化オペレーションに関するメタデータを書き込む場所を Encryption AWS CLI に指示する`--metadata-output`パラメータもあります。 AWS Encryption CLI は、暗号化されたファイルごとに 1 つのメタデータレコードを書き込みます。

バージョン 2.1.x.以降では、[`--commitment-policy parameter`](crypto-cli-how-to.md#crypto-cli-commitment-policy) はオプションですが推奨されます。コマンドまたはスクリプトが暗号化テキストを復号化できないために失敗した場合は、明示的なコミットメントポリシー設定により、問題を迅速に検出できます。

コマンドが完了すると、Encryption AWS CLI は暗号化されたファイルを `TestEnc` ディレクトリに書き込みますが、出力は返しません。

最後のコマンドは `TestEnc` ディレクトリ内のファイルを一覧表示します。プレーンテキストの入力ファイルごとに、暗号化されたコンテンツの出力ファイルが 1 つあります。コマンドは代替サフィックスを指定していないため、暗号化コマンドは各入力ファイル名に `.encrypted` を付加しました。

------
#### [ Bash ]

```
# To run this example, replace the fictitious key ARN with a valid master key identifier.
$  keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

$ aws-encryption-cli --encrypt \
                     --input testdir --recursive\
                     --wrapping-keys key=$keyArn \
                     --encryption-context dept=IT \
                     --commitment-policy require-encrypt-require-decrypt \
                     --metadata-output ~/metadata \
                     --output testenc

$ ls testenc
cool-new-thing.py.encrypted  employees.csv.encrypted  hello.txt.encrypted
```

------
#### [ PowerShell ]

```
# To run this example, replace the fictitious key ARN with a valid master key identifier.
PS C:\> $keyArn = arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

PS C:\> aws-encryption-cli --encrypt `
                           --input .\TestDir --recursive `
                           --wrapping-keys key=$keyArn `
                           --encryption-context dept=IT `
                           --commitment-policy require-encrypt-require-decrypt `
                           --metadata-output .\Metadata\Metadata.txt `
                           --output .\TestEnc

PS C:\> dir .\TestEnc

    Directory: C:\TestEnc

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/17/2017   2:32 PM           2713 cool-new-thing.py.encrypted
-a----        9/17/2017   2:32 PM            620 Hello.txt.encrypted
-a----        9/17/2017   2:32 PM            585 Employees.csv.encrypted
```

------

## ディレクトリ内のすべてのファイルの復号
<a name="cli-example-decrypt-directory"></a>

この例では、ディレクトリ内のすべてのファイルを復号します。これは、前の例で暗号化された `TestEnc` ディレクトリ内のファイルから始まります。

------
#### [ Bash ]

```
$  ls testenc
cool-new-thing.py.encrypted  hello.txt.encrypted  employees.csv.encrypted
```

------
#### [ PowerShell ]

```
PS C:\> dir C:\TestEnc

    Directory: C:\TestEnc

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/17/2017   2:32 PM           2713 cool-new-thing.py.encrypted
-a----        9/17/2017   2:32 PM            620 Hello.txt.encrypted
-a----        9/17/2017   2:32 PM            585 Employees.csv.encrypted
```

------

この復号コマンドは、TestEnc ディレクトリ内のすべてのファイルを復号し、プレーンテキストファイルを TestDec ディレクトリに書き込みます。**キー**属性と[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) AWS 値を持つ `--wrapping-keys`パラメータは、ファイルの復号 AWS KMS keys に使用する Encryption CLI に指示します。コマンドは `--interactive`パラメータを使用して、同じ名前のファイルを上書きする前に Encryption AWS CLI にプロンプトを表示します。

このコマンドは、ファイルが暗号化されたときに指定された暗号化コンテキストも使用します。複数のファイルを復号する場合、Encryption AWS CLI はすべてのファイルの暗号化コンテキストをチェックします。ファイルの暗号化コンテキストチェックが失敗した場合、Encryption AWS CLI はファイルを拒否し、警告を書き込み、失敗をメタデータに記録し、残りのファイルのチェックを続行します。 AWS Encryption CLI が他の理由でファイルの復号に失敗した場合、復号コマンド全体がすぐに失敗します。

この例では、すべての入力ファイルで暗号化されたメッセージに `dept=IT` 暗号化コンテキスト要素が含まれています。ただし、異なる暗号化コンテキストを使用してメッセージを復号している場合でも、暗号化コンテキストの一部を確認できる可能性があります。たとえば、あるメッセージの暗号化コンテキストが `dept=finance` で、他のメッセージが `dept=IT` だった場合、その値を指定しないことで暗号化コンテキストに常に `dept` 名が含まれていることを確認できます。より具体的にするには、別々のコマンドでファイルを復号します。

復号コマンドから返される出力はありませんが、ディレクトリ一覧コマンドを使用して `.decrypted` サフィックスが付いた新しいファイルを作成したことを確認できます。プレーンテキストコンテンツを表示するには、ファイルコンテンツを取得するコマンドを使用します。

------
#### [ Bash ]

```
# To run this example, replace the fictitious key ARN with a valid master key identifier.
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

$ aws-encryption-cli --decrypt \
                     --input testenc --recursive \
                     --wrapping-keys key=$keyArn \
                     --encryption-context dept=IT \
                     --commitment-policy require-encrypt-require-decrypt \
                     --metadata-output ~/metadata \
                     --max-encrypted-data-keys 1 \
                     --buffer \
                     --output testdec --interactive

$ ls testdec
cool-new-thing.py.encrypted.decrypted  hello.txt.encrypted.decrypted  employees.csv.encrypted.decrypted
```

------
#### [ PowerShell ]

```
# To run this example, replace the fictitious key ARN with a valid master key identifier.
PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

PS C:\> aws-encryption-cli --decrypt `
                           --input C:\TestEnc --recursive `
                           --wrapping-keys key=$keyArn `
                           --encryption-context dept=IT `
                           --commitment-policy require-encrypt-require-decrypt `
                           --metadata-output $home\Metadata.txt `
                           --max-encrypted-data-keys 1 `
                           --buffer `
                           --output C:\TestDec --interactive

PS C:\> dir .\TestDec


    Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        10/8/2017   4:57 PM           2139 cool-new-thing.py.encrypted.decrypted
-a----        10/8/2017   4:57 PM             46 Employees.csv.encrypted.decrypted
-a----        10/8/2017   4:57 PM             11 Hello.txt.encrypted.decrypted
```

------

## コマンドラインでの暗号化と復号
<a name="cli-example-stdin"></a>

これらの例は、入力をコマンドにパイプし (stdin)、出力をコマンドライン (stdout) に書き込む方法を示しています。これらは、コマンドで stdin と stdout を表す方法と、組み込みの Base64 エンコードツールを使用してシェルが ASCII 以外の文字を誤って解釈するのを防ぐ方法について説明します。

この例では、パイププレーンテキストの文字列を暗号化コマンドにパイプし、暗号化されたメッセージを変数に保存します。次に、変数に格納された暗号化されたメッセージを復号コマンドにパイプし、その出力をパイプライン (stdout) に書き込みます。

この例では、3 つのコマンドで構成されています。
+ 最初のコマンドは、 の[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) を `$keyArn`変数 AWS KMS key に保存します。

------
#### [ Bash ]

  ```
  $  keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
  ```

------
#### [ PowerShell ]

  ```
  PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
  ```

------

   
+ 2 番目のコマンドは、`Hello World` 文字列を暗号化コマンドにパイプし、その結果を `$encrypted` 変数に保存します。

  `--input` および `--output` パラメータは、すべての AWS Encryption CLI コマンドで必須です。入力がコマンドにパイプされている (stdin) ことを示すには、(`-`) を `--input` パラメータの値に使用します。出力をコマンドラインに送信する (stdout) には、`--output` パラメータの値にハイフンを使用します。

  `--encode` パラメータは、出力を返す前に Base64 エンコードします。これにより、暗号化されたメッセージの ASCII 以外の文字をシェルが誤って解釈することを防止します。

  このコマンドは PoC (概念実証) に過ぎないため、暗号化コンテキストを省略し、メタデータを抑制します (`-S`)。

------
#### [ Bash ]

  ```
  $ encrypted=$(echo 'Hello World' | aws-encryption-cli --encrypt -S \
                                                        --input - --output - --encode \
                                                        --wrapping-keys key=$keyArn )
  ```

------
#### [ PowerShell ]

  ```
  PS C:\> $encrypted = 'Hello World' | aws-encryption-cli --encrypt -S `
                                                          --input - --output - --encode `
                                                          --wrapping-keys key=$keyArn
  ```

------

   
+ 3 番目のコマンドは、`$encrypted` 変数に格納された暗号化されたメッセージを復号コマンドにパイプします。

  この復号コマンドでは、入力がパイプラインから来ている (stdin) ことを示すために `--input -` を使い、出力をパイプラインに送る (stdout) ために `--output -` を使います。(入力パラメータは実際の入力バイトではなく、入力の場所を取るため、`$encrypted` 変数を `--input` パラメータの値として使用することはできません。) 

  この例では、 `--wrapping-keys`パラメータの検出****属性を使用して、Encryption AWS CLI が任意の AWS KMS key を使用してデータを復号できるようにします。[コミットメントポリシー](concepts.md#commitment-policy)は指定しないため、バージョン 2.1.*x* 以降のデフォルト値 `require-encrypt-require-decrypt` が使用されます。

  出力が暗号化されてエンコードされたため、復号コマンドは `--decode` パラメータを使用して Base64 でエンコードされた入力を復号する前にデコードします。また、`--decode` パラメータを使用して、Base64 でエンコードされた入力を暗号化する前にデコードすることもできます。

  ここでも、コマンドは暗号化コンテキストを省略し、メタデータを抑制します (-`S`)。

------
#### [ Bash ]

  ```
  $  echo $encrypted | aws-encryption-cli --decrypt --wrapping-keys discovery=true --input - --output - --decode --buffer -S
  Hello World
  ```

------
#### [ PowerShell ]

  ```
  PS C:\> $encrypted | aws-encryption-cli --decrypt --wrapping-keys discovery=$true --input - --output - --decode --buffer -S
  Hello World
  ```

------

暗号化および復号オペレーションは、介在する変数なしで 1 つのコマンドで実行することもできます。

前の例と同様に、`--input` および `--output` パラメータには `-` 値があり、このコマンドは `--encode` パラメータを使用して出力をエンコードし、`--decode` パラメータを使用して入力をデコードします。

------
#### [ Bash ]

```
$  keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

$  echo 'Hello World' |
          aws-encryption-cli --encrypt --wrapping-keys key=$keyArn --input - --output - --encode -S |
          aws-encryption-cli --decrypt --wrapping-keys discovery=true --input - --output - --decode -S
Hello World
```

------
#### [ PowerShell ]

```
PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

PS C:\> 'Hello World' |
               aws-encryption-cli --encrypt --wrapping-keys key=$keyArn --input - --output - --encode -S |
               aws-encryption-cli --decrypt --wrapping-keys discovery=$true --input - --output - --decode -S
Hello World
```

------

## 複数のマスターキーの使用
<a name="cli-example-multimaster"></a>

この例では、 AWS Encryption CLI でデータを暗号化および復号するときに複数のマスターキーを使用する方法を示します。

複数のマスターキーを使用してデータを暗号化すると、いずれかのマスターキーを使用してデータを復号できます。この戦略では、マスターキーの 1 つが使用できなくてもデータを復号できます。暗号化されたデータを複数の に保存する場合 AWS リージョン、この戦略では、同じリージョンのマスターキーを使用してデータを復号化できます。

複数のマスターキーで暗号化する場合、最初のマスターキーが特別な役割を果たします。それは、データの暗号化に使用されるデータキーを生成します。残りのマスターキーは、プレーンテキストのデータキーを暗号化します。結果として得られる[暗号化されたメッセージ](concepts.md#message)には、暗号化されたデータと、各マスターキーに対して 1 つずつの暗号化されたデータキーの集合が含まれます。最初のマスターキーがデータキーを生成したにもかかわらず、いずれのマスターキーもデータキーの 1 つを復号でき、それをデータキーの復号に使用することができます。

**3 つのマスターキーによる暗号化**

このコマンド例では、3 つの AWS リージョンの 3 つのラッピングキーを使用して `Finance.log` ファイルを暗号化しています。

これは、暗号化されたメッセージを `Archive` ディレクトリに書き込みます。このコマンドでは、サフィックスを抑制する値を指定せずに `--suffix` パラメータを使用しているため、入力ファイル名と出力ファイル名は変わりません。

このコマンドは、`--wrapping-keys` パラメータとその 3 つの **key** 属性を使用します。同じコマンドで複数の `--wrapping-keys` パラメータを使用することもできます。

ログファイルを暗号化するために、Encryption AWS CLI はリストの最初のラッピングキー に`$key1`、データの暗号化に使用するデータキーの生成を求めます。次に、他の各ラッピングキーを使用して同じデータキーのプレーンテキストコピーを暗号化します。出力ファイルの暗号化されたメッセージには、暗号化された 3 つのデータキーがすべて含まれています。

------
#### [ Bash ]

```
$ key1=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
$ key2=arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef
$ key3=arn:aws:kms:ap-southeast-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d

$ aws-encryption-cli --encrypt --input /logs/finance.log \
                               --output /archive --suffix \
                               --encryption-context class=log \
                               --metadata-output ~/metadata \
                               --wrapping-keys key=$key1 key=$key2 key=$key3
```

------
#### [ PowerShell ]

```
PS C:\> $key1 = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
PS C:\> $key2 = 'arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef'
PS C:\> $key3 = 'arn:aws:kms:ap-southeast-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d'

PS C:\> aws-encryption-cli --encrypt --input D:\Logs\Finance.log `
                           --output D:\Archive --suffix `
                           --encryption-context class=log `
                           --metadata-output $home\Metadata.txt `
                           --wrapping-keys key=$key1 key=$key2 key=$key3
```

------

このコマンドは、`Finance.log` ファイルの暗号化されたコピーを復号し、それを `Finance.log.clear` ディレクトリの `Finance` ファイルに書き込みます。3 で暗号化されたデータを復号するには AWS KMS keys、同じ 3 AWS KMS keys つ、またはそのサブセットを指定できます。この例では AWS KMS keysを 1 つだけ指定します。

データの復号 AWS KMS keys に使用する AWS Encryption CLI に指示するには、 `--wrapping-keys`パラメータの **key** 属性を使用します。で復号する場合 AWS KMS keys、**キー**属性の値は[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) である必要があります。

 AWS KMS keys 指定した で [Decrypt API](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) を呼び出すアクセス許可が必要です。詳細については、「[AWS KMSに対する認証とアクセスコントロール](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)」を参照してください。

ベストプラクティスとして、この例では `--max-encrypted-data-keys` パラメータを使用して、暗号化されたデータキーの数が多すぎる不正なメッセージの復号化を回避します。この例では、復号化にラッピングキーを 1 つだけ使用しますが、暗号化されたメッセージには、暗号化時に使用される 3 つのラッピングキーごとに 1 つずつ、合計 3 つの暗号化されたデータキーがあります。暗号化されたデータキーの予想数または適切な最大値 (5 など) を指定します。3 より小さい最大値を指定すると、コマンドは失敗します。詳細については、「[暗号化されたデータキーの制限](configure.md#config-limit-keys)」を参照してください。

------
#### [ Bash ]

```
$ aws-encryption-cli --decrypt --input /archive/finance.log \
                     --wrapping-keys key=$key1 \
                     --output /finance --suffix '.clear' \
                     --metadata-output ~/metadata \
                     --max-encrypted-data-keys 3 \
                     --buffer \
                     --encryption-context class=log
```

------
#### [ PowerShell ]

```
PS C:\> aws-encryption-cli --decrypt `
                           --input D:\Archive\Finance.log `
                           --wrapping-keys key=$key1 `
                           --output D:\Finance --suffix '.clear' `
                           --metadata-output .\Metadata\Metadata.txt `
                           --max-encrypted-data-keys 3 `
                           --buffer `
                           --encryption-context class=log
```

------

## スクリプトでの暗号化と復号
<a name="cli-example-script"></a>

この例では、スクリプトで AWS Encryption CLI を使用する方法を示します。データを暗号化または復号するだけのスクリプト、またはデータ管理プロセスの一部として暗号化または復号するスクリプトを作成できます。

この例では、スクリプトはログファイルのコレクションを取得、圧縮してから暗号化し、暗号化されたファイルを Amazon S3 バケットにコピーします。このスクリプトは各ファイルを別々に処理するため、それらを個別に復号して展開できます。

ファイルを圧縮して暗号化するときは、暗号化する前に圧縮する必要があります。適切に暗号化されたデータは圧縮できません。

**警告**  
シークレットデータと悪意のあるユーザーによって制御される可能性のあるデータの両方を含むデータを圧縮するときは注意が必要です。圧縮されたデータの最終サイズは、誤ってそのコンテンツに関する機密情報を明らかにする可能性があります。

------
#### [ Bash ]

```
# Continue running even if an operation fails.
set +e

dir=$1
encryptionContext=$2
s3bucket=$3
s3folder=$4
masterKeyProvider="aws-kms"
metadataOutput="/tmp/metadata-$(date +%s)"

compress(){
    gzip -qf $1
}

encrypt(){
    # -e encrypt
    # -i input
    # -o output
    # --metadata-output unique file for metadata
    # -m masterKey read from environment variable
    # -c encryption context read from the second argument.
    # -v be verbose
    aws-encryption-cli -e -i ${1} -o $(dirname ${1}) --metadata-output ${metadataOutput} -m key="${masterKey}" provider="${masterKeyProvider}" -c "${encryptionContext}" -v
}


s3put (){
    # copy file argument 1 to s3 location passed into the script.
    aws s3 cp ${1} ${s3bucket}/${s3folder}
}

# Validate all required arguments are present.
if [ "${dir}" ] && [ "${encryptionContext}" ] && [ "${s3bucket}" ] && [ "${s3folder}" ] && [ "${masterKey}" ]; then

# Is $dir a valid directory?
test -d "${dir}"
if [ $? -ne 0 ]; then
    echo "Input is not a directory; exiting"
    exit 1
fi

# Iterate over all the files in the directory, except *gz and *encrypted (in case of a re-run).
for f in $(find ${dir} -type f \( -name "*" ! -name \*.gz ! -name \*encrypted \) ); do
    echo "Working on $f"
    compress ${f}
    encrypt ${f}.gz
    rm -f ${f}.gz
    s3put ${f}.gz.encrypted
done;
else
    echo "Arguments: <Directory> <encryption context> <s3://bucketname> <s3 folder>"
    echo " and ENV var \$masterKey must be set"
    exit 255
fi
```

------
#### [ PowerShell ]

```
#Requires -Modules AWSPowerShell, Microsoft.PowerShell.Archive
Param
(
    [Parameter(Mandatory)]
    [ValidateScript({Test-Path $_})]
    [String[]]
    $FilePath,

    [Parameter()]
    [Switch]
    $Recurse,

    [Parameter(Mandatory=$true)]
    [String]
    $wrappingKeyID,

    [Parameter()]
    [String]
    $masterKeyProvider = 'aws-kms',

    [Parameter(Mandatory)]
    [ValidateScript({Test-Path $_})]
    [String]
    $ZipDirectory,

    [Parameter(Mandatory)]
    [ValidateScript({Test-Path $_})]
    [String]
    $EncryptDirectory,

    [Parameter()]
    [String]
    $EncryptionContext,

    [Parameter(Mandatory)]
    [ValidateScript({Test-Path $_})]
    [String]
    $MetadataDirectory,

    [Parameter(Mandatory)]
    [ValidateScript({Test-S3Bucket -BucketName $_})]
    [String]
    $S3Bucket,

    [Parameter()]
    [String]
    $S3BucketFolder
)

BEGIN {}
PROCESS {
    if ($files = dir $FilePath -Recurse:$Recurse)
    {

        # Step 1: Compress
        foreach ($file in $files)
        {
            $fileName = $file.Name
            try
            {
                Microsoft.PowerShell.Archive\Compress-Archive -Path $file.FullName -DestinationPath $ZipDirectory\$filename.zip
            }
            catch
            {
                Write-Error "Zip failed on $file.FullName"
            }

            # Step 2: Encrypt
            if (-not (Test-Path "$ZipDirectory\$filename.zip"))
            {
                Write-Error "Cannot find zipped file: $ZipDirectory\$filename.zip"
            }
            else
            {
                # 2>&1 captures command output
                $err = (aws-encryption-cli -e -i "$ZipDirectory\$filename.zip" `
                                           -o $EncryptDirectory `
                                           -m key=$wrappingKeyID provider=$masterKeyProvider `
                                           -c $EncryptionContext `
                                           --metadata-output $MetadataDirectory `
                                           -v) 2>&1

                # Check error status
                if ($? -eq $false)
                {
                    # Write the error
                    $err
                }
                elseif (Test-Path "$EncryptDirectory\$fileName.zip.encrypted")
                {
                    # Step 3: Write to S3 bucket
                    if ($S3BucketFolder)
                    {
                        Write-S3Object -BucketName $S3Bucket -File "$EncryptDirectory\$fileName.zip.encrypted" -Key "$S3BucketFolder/$fileName.zip.encrypted"

                    }
                    else
                    {
                        Write-S3Object -BucketName $S3Bucket -File "$EncryptDirectory\$fileName.zip.encrypted"
                    }
                }
            }
        }
    }
}
```

------

## データキーキャッシュの使用
<a name="cli-example-caching"></a>

この例では、多数のファイルを暗号化するコマンドで[データキーキャッシュ](data-key-caching.md)を使用します。

デフォルトでは、Encryption AWS CLI (および の他のバージョン AWS Encryption SDK) は、暗号化するファイルごとに一意のデータキーを生成します。各オペレーションに一意のデータキーを使用するのは暗号化のベストプラクティスですが、一部の状況では限定的なデータキーの再利用が許容されます。データキーキャッシュを検討している場合は、セキュリティエンジニアに相談して、アプリケーションのセキュリティ要件を理解し、適切なセキュリティしきい値を判断してください。

この例では、マスターキープロバイダへのリクエストの頻度を減らすことによって、データキーキャッシュは暗号化オペレーションを高速化します。

この例のコマンドは、合計約 800 の小さなログファイルを含む複数のサブディレクトリを持つ大きなディレクトリを暗号化します。最初のコマンドは、 AWS KMS key の ARN を `keyARN` 変数に保存します。2 番目のコマンドは、入力ディレクトリ内のすべてのファイルを (再帰的に) 暗号化し、アーカイブディレクトリに書き込みます。このコマンドでは、`--suffix` パラメータを使用して `.archive` サフィックスを指定します。

`--caching` パラメータはデータキーキャッシュを有効にします。シリアルのファイル処理では一度に複数のデータキーを使用することはないため、キャッシュ内のデータキーの数を制限する **capacity** 属性は 1 に設定されます。キャッシュされたデータキーの使用可能時間を決定する **max\$1age** 属性は 10 秒に設定します。

オプションの **max\$1messages\$1encrypted** 属性は 10 個のメッセージに設定されているため、1 つのデータキーが 10 個以上のファイルを暗号化するために使用されることはありません。各データキーで暗号化するファイル数を制限することで、万一データキーが侵害された場合に影響を受けるファイルの数を減らすことができます。

オペレーティングシステムが生成するログファイルに対してこのコマンドを実行するには、管理者アクセス許可 (Linux では `sudo`、Windows では [**管理者として実行**]) が必要な場合があります。

------
#### [ Bash ]

```
$  keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

$  aws-encryption-cli --encrypt \
                      --input /var/log/httpd --recursive \
                      --output ~/archive --suffix .archive \
                      --wrapping-keys key=$keyArn \
                      --encryption-context class=log \
                      --suppress-metadata \
                      --caching capacity=1 max_age=10 max_messages_encrypted=10
```

------
#### [ PowerShell ]

```
PS C:\> $keyARN = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

PS C:\> aws-encryption-cli --encrypt `
                           --input C:\Windows\Logs --recursive `
                           --output $home\Archive --suffix '.archive' `
                           --wrapping-keys key=$keyARN `
                           --encryption-context class=log `
                           --suppress-metadata `
                           --caching capacity=1 max_age=10 max_messages_encrypted=10
```

------

データキーキャッシュの効果をテストするために、この例では PowerShell の [Measure-Command](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/measure-command) コマンドレットを使用します。データキーキャッシュなしでこの例を実行すると、完了に約 25 秒かかります。このプロセスは、ディレクトリ内のファイルごとに新しいデータキーを生成します。

```
PS C:\> Measure-Command {aws-encryption-cli --encrypt `
                                            --input C:\Windows\Logs --recursive `
                                            --output $home\Archive  --suffix '.archive' `
                                            --wrapping-keys key=$keyARN `
                                            --encryption-context class=log `
                                            --suppress-metadata }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 25
Milliseconds      : 453
Ticks             : 254531202
TotalDays         : 0.000294596298611111
TotalHours        : 0.00707031116666667
TotalMinutes      : 0.42421867
TotalSeconds      : 25.4531202
TotalMilliseconds : 25453.1202
```

データキーキャッシュを使用すると、各データキーを最大 10 個のファイルに制限しても、処理が迅速になります。このコマンドは完了するまでに 12 秒もかからず、マスターキープロバイダへの呼び出し回数を元の値の 1/10 に減らしました。

```
PS C:\> Measure-Command {aws-encryption-cli --encrypt `
                                            --input C:\Windows\Logs --recursive `
                                            --output $home\Archive  --suffix '.archive' `
                                            --wrapping-keys key=$keyARN `
                                            --encryption-context class=log `
                                            --suppress-metadata `
                                            --caching capacity=1 max_age=10 max_messages_encrypted=10}


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 11
Milliseconds      : 813
Ticks             : 118132640
TotalDays         : 0.000136727592592593
TotalHours        : 0.00328146222222222
TotalMinutes      : 0.196887733333333
TotalSeconds      : 11.813264
TotalMilliseconds : 11813.264
```

`max_messages_encrypted` の制限を解除すると、すべてのファイルが同じデータキーで暗号化されます。この変更では、プロセスは大幅に高速化されず、データキーの再利用に伴うリスクが高まります。ただし、マスターキープロバイダの呼び出し数は 1 回に減ります。

```
PS C:\> Measure-Command {aws-encryption-cli --encrypt `
                                            --input C:\Windows\Logs --recursive `
                                            --output $home\Archive  --suffix '.archive' `
                                            --wrapping-keys key=$keyARN `
                                            --encryption-context class=log `
                                            --suppress-metadata `
                                            --caching capacity=1 max_age=10}


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 10
Milliseconds      : 252
Ticks             : 102523367
TotalDays         : 0.000118661304398148
TotalHours        : 0.00284787130555556
TotalMinutes      : 0.170872278333333
TotalSeconds      : 10.2523367
TotalMilliseconds : 10252.3367
```