

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

# AWS Encryption SDKとは
<a name="introduction"></a>

 AWS Encryption SDK は、業界標準とベストプラクティスを使用して、すべてのユーザーがデータの暗号化と復号を簡単に行えるように設計されたクライアント側の暗号化ライブラリです。これにより、データの暗号化と復号の最善の方法ではなく、アプリケーションのコア機能に集中できるようになります。 AWS Encryption SDK は、Apache 2.0 ライセンスの下で無料で提供されます。

 AWS Encryption SDK は次のような質問に答えます。
+ どの暗号化アルゴリズムを使用するべきですか。
+ どのように、またはどのモードで、そのアルゴリズムを使用すべきですか。
+ 暗号化キーを生成するにはどうすればよいですか。
+ 暗号化キーを保護するにはどうすればよいですか。どこに保存するべきですか。
+ 暗号化されたデータをポータブルにするにはどうしたらよいですか。
+ 目的の受取人が暗号化されたデータを確実に読めるようにするにはどうすればよいですか。
+ 暗号化されたデータが書き込まれてから読み込まれるまでに変更されないようにするにはどうすればよいですか。
+ が AWS KMS 返すデータキーの使用方法を教えてください。

では AWS Encryption SDK、データを保護するために使用するラッピング[キーを決定するマスターキープロバイダー](concepts.md#master-key-provider)またはキー[リング](concepts.md#keyring)を定義します。次に、 が提供する簡単な方法を使用してデータを暗号化および復号します AWS Encryption SDK。残りは が AWS Encryption SDK 行います。

を使用しない場合 AWS Encryption SDK、アプリケーションのコア機能よりも暗号化ソリューションの構築により多くの労力を費やす可能性があります。は、以下の情報を提供して、 AWS Encryption SDK これらの質問に答えます。

**暗号化のベストプラクティスに従ったデフォルトの実装**  
デフォルトでは、 は暗号化するデータオブジェクトごとに一意のデータキー AWS Encryption SDK を生成します。各暗号化操作に一意のデータキーを使用する暗号化のベストプラクティスに従います。  
は、安全で認証された対称キーアルゴリズムを使用してデータを AWS Encryption SDK 暗号化します。詳細については、「[でサポートされているアルゴリズムスイート AWS Encryption SDK](supported-algorithms.md)」を参照してください。

**ラッピングキーによるデータキーの保護のためのフレームワーク**  
は、1 つ以上のラッピングキーで暗号化することで、データを暗号化するデータキー AWS Encryption SDK を保護します。複数のラッピングキーを使用してデータキーを暗号化するフレームワークを提供することで、 AWS Encryption SDK は暗号化されたデータを移植可能にします。  
たとえば、 AWS KMS key の AWS KMS とオンプレミス HSM のキーでデータを暗号化します。片方が利用できない場合や、呼び出し元に両方のキーを使用する権限がない場合に備えて、いずれかのラッピングキーを使用してデータを復号できます。

**暗号化されたデータと暗号化されたデータキーを一緒に保存する形式のメッセージ**  
は、暗号化されたデータと暗号化されたデータキーを、定義されたデータ形式を使用する[暗号化されたメッセージ](concepts.md#message)にまとめて AWS Encryption SDK 保存します。つまり、 がユーザー AWS Encryption SDK に代わってデータを暗号化するデータキーを追跡または保護する必要はありません。

の一部の言語実装には AWS SDK AWS Encryption SDK が必要ですが、 AWS Encryption SDK は を必要とせず AWS アカウント 、どの AWS サービスにも依存しません。は、 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms-keys)を使用してデータを保護する AWS アカウント 場合にのみ必要です。

## オープンソースリポジトリで開発
<a name="esdk-repos"></a>

 AWS Encryption SDK は GitHub のオープンソースリポジトリで開発されています。これらのリポジトリを使用して、コードを表示したり、課題を読んだり送信したり、言語実装に固有の情報を見つけたりできます。　
+ AWS Encryption SDK for C — [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)
+ AWS Encryption SDK for .NET — `aws-encryption-sdk`リポジトリの [.NET](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) ディレクトリ。
+ AWS 暗号化 CLI — [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)
+ AWS Encryption SDK for Java — [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)
+ AWS Encryption SDK for JavaScript — [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)
+ AWS Encryption SDK for Python — [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/)
+ AWS Encryption SDK for Rust — `aws-encryption-sdk`リポジトリの [Rust](https://github.com/aws/aws-encryption-sdk-dafny/tree/mainline/AwsEncryptionSDK/runtimes/rust/) ディレクトリ。
+ AWS Encryption SDK Go の場合 — `aws-encryption-sdk`リポジトリの [Go](https://github.com/aws/aws-encryption-sdk/tree/mainline/releases/go/encryption-sdk/) ディレクトリ

## 暗号化ライブラリやサービスとの互換性
<a name="intro-compatibility"></a>

 AWS Encryption SDK は複数の[プログラミング言語で](programming-languages.md)サポートされています。言語実装はすべて相互運用可能です。ある言語実装で暗号化し、別の言語実装で復号できます。相互運用性は、言語の制約を受ける可能性があります。その場合の制約については、言語実装に関するトピックで説明します。また、暗号化および復号を行う場合は、互換性のあるキーリング、またはマスターキーとマスターキープロバイダーを使用する必要があります。詳細については、「[キーリングの互換性](choose-keyring.md#keyring-compatibility)」を参照してください。

ただし、 を他のライブラリと相互運用 AWS Encryption SDK することはできません。各ライブラリは暗号化されたデータを異なる形式で返すため、あるライブラリで暗号化したデータを別のライブラリで復号することはできません。

**DynamoDB 暗号化クライアントおよび Amazon S3 クライアント側の暗号化**  <a name="ESDK-DDBEC"></a>
は、[DynamoDB 暗号化クライアント](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/)または [Amazon S3 クライアント側の暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)によって暗号化されたデータを復号 AWS Encryption SDK できません。これらのライブラリは、 が AWS Encryption SDK 返す[暗号化されたメッセージを](concepts.md#message)復号できません。 

**AWS Key Management Service (AWS KMS)**  <a name="ESDK-KMS"></a>
 AWS Encryption SDK は、 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)および [データキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)を使用して、マルチリージョン KMS キーを含むデータを保護できます。たとえば、 AWS KMS keys の 1 つ以上の でデータを暗号化 AWS Encryption SDK するように を設定できます AWS アカウント。ただし、そのデータを復号 AWS Encryption SDK するには、 を使用する必要があります。  
は、 AWS KMS [Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) または [ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) オペレーションが返す暗号文を復号 AWS Encryption SDK できません。同様に、 AWS KMS [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) オペレーションでは、 が AWS Encryption SDK 返す[暗号化されたメッセージを](concepts.md#message)復号できません。  
は[、対称暗号化 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#symmetric-cmks)のみ AWS Encryption SDK をサポートします。「 AWS Encryption SDK」では、暗号化または署名に [非対称 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#asymmetric-cmks) を使用できません。 AWS Encryption SDK は、メッセージに署名する[アルゴリズムスイート](supported-algorithms.md)に対して、独自の ECDSA 署名キーを生成します。

## サポートとメンテナンス
<a name="support"></a>

 AWS Encryption SDK は、 AWS SDK とツールが使用するのと同じ[メンテナンスポリシー](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html)を使用します。これには、バージョニングフェーズとライフサイクルフェーズが含まれます。[ベストプラクティス](best-practices.md)として、プログラミング言語 AWS Encryption SDK に利用可能な最新バージョンの を使用し、新しいバージョンがリリースされたらアップグレードすることをお勧めします。バージョン 1.7.*x* より前の AWS Encryption SDK バージョンからバージョン 2.0.*x* 以降にアップグレードするなど、バージョンに大きな変更が必要な場合は、[詳細な手順](migration.md)が役立ちます。

の各プログラミング言語実装 AWS Encryption SDK は、個別のオープンソース GitHub リポジトリで開発されています。各バージョンのライフサイクルフェーズやサポートフェーズは、リポジトリによって異なる可能性があります。　 たとえば、特定のバージョンの は、1 つのプログラミング言語での一般提供 (フルサポート) フェーズにあるものの、別のプログラミング言語でend-of-supportフェーズにある AWS Encryption SDK 場合があります。可能な限り完全にサポートされているバージョンを使用し、サポートが終了したバージョンは避けることをお勧めします。　　

プログラミング言語 AWS Encryption SDK のバージョンライフサイクルフェーズを確認するには、各 AWS Encryption SDK リポジトリの `SUPPORT_POLICY.rst` ファイルを参照してください。
+ AWS Encryption SDK for C — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-c/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for .NET — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-dafny/blob/mainline/SUPPORT_POLICY.rst)
+ AWS 暗号化 CLI — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-cli/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for Java — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-java/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for JavaScript — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for Python — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-python/blob/master/SUPPORT_POLICY.rst)

詳細については、[のバージョン AWS Encryption SDK](about-versions.md)「SDK とツールリファレンスガイド」の「」および AWS SDKs」を参照してください。 [AWS SDKs ](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) 

## 詳細情報
<a name="intro-see-also"></a>

 AWS Encryption SDK およびクライアント側の暗号化の詳細については、以下のソースを試してください。
+ この SDK で使用される用語と概念のヘルプについては、「[の概念 AWS Encryption SDK](concepts.md)」を参照してください。
+ ベストプラクティスのガイドラインについては、「[のベストプラクティス AWS Encryption SDK](best-practices.md)」を参照してください。
+ SDK の仕組みについては、「[SDK のしくみ](how-it-works.md)」を参照してください。
+ でオプションを設定する方法を示す例については AWS Encryption SDK、「」を参照してください[の設定 AWS Encryption SDK](configure.md)。
+ 技術情報の詳細については、「[AWS Encryption SDK リファレンス](reference.md)」を参照してください。
+ の技術仕様については AWS Encryption SDK、GitHub の[AWS Encryption SDK 「仕様](https://github.com/awslabs/aws-encryption-sdk-specification/)」を参照してください。
+ の使用に関する質問に対する回答については AWS Encryption SDK、[AWS 「Crypto Tools Discussion Forum](https://forums.aws.amazon.com/forum.jspa?forumID=302)」を読んで投稿してください。

の AWS Encryption SDK さまざまなプログラミング言語での実装については、「」を参照してください。
+ **C**: GitHub の [AWS Encryption SDK for C](c-language.md)、 AWS Encryption SDK [C ドキュメント](https://aws.github.io/aws-encryption-sdk-c/html/)、および [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/) リポジトリを参照してください。
+ **C\$1/.NET**: GitHub の「[AWS Encryption SDK .NET 用](dot-net.md)」と `aws-encryption-sdk` リポジトリの [aws-encryption-sdk-net](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) ディレクトリを参照してください。
+ **コマンドラインインターフェイス**: GitHub の[AWS Encryption SDK コマンドラインインターフェイス](crypto-cli.md)「」、「Encryption CLI AWS のドキュメントを読む」、および[aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)」リポジトリを参照してください。 [https://aws-encryption-sdk-cli.readthedocs.io/en/latest/](https://aws-encryption-sdk-cli.readthedocs.io/en/latest/)
+ **Java**: GitHub の[AWS Encryption SDK for Java](java.md)「」、 AWS Encryption SDK [「Javadoc](https://aws.github.io/aws-encryption-sdk-java/)」、および[aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)」リポジトリを参照してください。

  **JavaScript**: 「[AWS Encryption SDK for JavaScript](javascript.md)」、GitHub の [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) リポジトリを参照してください。
+ **Python**: GitHub の [AWS Encryption SDK for Python](python.md)、 AWS Encryption SDK [Python ドキュメント](https://aws-encryption-sdk-python.readthedocs.io/en/latest/)、および [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/) リポジトリを参照してください。

## フィードバックを送る
<a name="report-issues"></a>

当社では、お客様からのフィードバックをお待ちしております。質問、コメント、ご報告いただく問題がある場合は、以下のリソースをご利用ください。
+ で潜在的なセキュリティ脆弱性を発見した場合は AWS Encryption SDK、[AWS セキュリティに通知](https://aws.amazon.com/security/vulnerability-reporting/)してください。GitHub で公開されている問題はご報告いただく必要はありません。
+ に関するフィードバックを提供するには AWS Encryption SDK、使用しているプログラミング言語の GitHub リポジトリに問題を提出します。
+ このドキュメントに関するフィードバックについては、このページの **[フィードバック]** のリンクをご利用ください。また、GitHub のこのドキュメントのオープンソースリポジトリである [aws-encryption-sdk-docs](https://github.com/awsdocs/aws-encryption-sdk-docs) で issue の作成やご参加をいただくこともできます。

# の概念 AWS Encryption SDK
<a name="concepts"></a>

このセクションでは、 で使用される概念を紹介し AWS Encryption SDK、用語集とリファレンスを提供します。これは、 の AWS Encryption SDK 仕組みと説明に使用する用語を理解するのに役立つように設計されています。

サポートが必要ですか?
+ がエン[ベロープ暗号化](#envelope-encryption) AWS Encryption SDK を使用してデータを保護する方法について説明します。
+ エンベロープ暗号化の要素、データを保護する[データキー](#DEK)およびデータキーを保護する[ラッピングキー](#master-key)についての説明。
+ どのラッピングキーを使用するかを決める[キーリング](#keyring)と[マスターキープロバイダー](#master-key-provider)についての説明。
+ 暗号化プロセスの整合性を向上させる[暗号化コンテキスト](#encryption-context)についての説明。これはオプションですが、推奨されるベストプラクティスです。
+ 暗号化メソッドが返す[暗号化されたメッセージ](#message)についての説明。
+ その後、 AWS Encryption SDK 任意の[プログラミング言語で](programming-languages.md) を使用する準備が整いました。

**Topics**
+ [エンベロープ暗号化](#envelope-encryption)
+ [データキー](#DEK)
+ [ラッピングキー](#master-key)
+ [キーリングおよびマスターキープロバイダー](#keyring)
+ [暗号化コンテキスト](#encryption-context)
+ [暗号化されたメッセージ](#message)
+ [アルゴリズムスイート](#crypto-algorithm)
+ [暗号化マテリアルマネージャー](#crypt-materials-manager)
+ [対称暗号化と非対称暗号化](#symmetric-key-encryption)
+ [キーコミットメント](#key-commitment)
+ [コミットメントポリシー](#commitment-policy)
+ [デジタル署名](#digital-sigs)

## エンベロープ暗号化
<a name="envelope-encryption"></a>

暗号化されたデータのセキュリティは、復号できるデータキーを保護することによって部分的に異なります。1 つの受け入れられているデータキーを保護するベストプラクティスは暗号化することです。これを行うには、*キー暗号化キー*つまり[ラッピングキー](#master-key)と呼ばれる別の暗号化キーが必要です。データキーを暗号化するためにラッピングキーを使用するこの方法は*エンベロープ暗号化*と呼ばれています。

**データキーの保護**  
は、各メッセージを一意のデータキーで AWS Encryption SDK 暗号化します。その後、指定したラッピングキーでデータキーを暗号化します。返される暗号化されたメッセージの暗号化されたデータを使用して、暗号化されたデータキーが保存されます。  
ラッピングキーを指定するには、[キーリング](#keyring)または[マスターキープロバイダー](#master-key-provider)を使用します。  

![\[によるエンベロープ暗号化 AWS Encryption SDK\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/envelope-encryption-70.png)


**複数のラッピングキーで同じデータを暗号化する**  
複数のラッピングキーでデータキーを暗号化できます。ユーザーごとに異なるラッピングキーを指定したり、異なるタイプのラッピングキーを指定したり、場所ごとにそのように指定したい場合があります。各ラッピングキーでは、それぞれ同じデータキーを暗号化します。は、暗号化されたデータを含むすべての暗号化されたデータキーを暗号化されたメッセージに AWS Encryption SDK 保存します。  
データを復号するには、この暗号化されたデータキーのいずれかを復号できるラッピングキーを指定する必要があります。  

![\[各ラッピングキーは同じデータキーを暗号化するため、ラッピングキーごとに 1 つの暗号化されたデータキーになります。\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/multiple-wrapping-keys-70.png)


**複数のアルゴリズムの強度の結合**  
デフォルトでは、 は AES-GCM 対称暗号化、キー取得関数 (HKDF)、および署名を備えた高度な[アルゴリズムスイート](supported-algorithms.md) AWS Encryption SDK を使用します。データキーを暗号化するには、ラッピングキーに適した[対称または非対称の暗号化アルゴリズム](#symmetric-key-encryption)を指定できます。  
一般的に、対称キー暗号化アルゴリズムは迅速で、非対称または*パブリックキー暗号化*よりも小さい暗号化テキストが生成されます。一方、パブリックキーのアルゴリズムはロールを本質的に分離し、キー管理を簡単にします。それぞれの強みを組み合わせるには、対称キー暗号化でデータを暗号化し、次にデータキーをパブリックキー暗号化で暗号化します。

## データキー
<a name="DEK"></a>

*データキー*は、データの暗号化に AWS Encryption SDK で使用される暗号化キーです。各データキーは、暗号化キーの要件に準拠したバイト配列です。[データキーキャッシュを使用している場合を除き](data-key-caching.md)、 AWS Encryption SDK は一意のデータキーを使用して各メッセージを暗号化します。

データキーを指定、生成、実装、拡張、保護、使用する必要はありません。 AWS Encryption SDK で暗号化オペレーションや復号オペレーションを呼び出しても、上記のアクションは行われません。

データキーを保護するために、 AWS Encryption SDK はラ[ッピング](#master-key)キーまたはマスターキーと呼ばれる 1 *つ以上のキー暗号化*キーでデータキーを暗号化します。は、プレーンテキストのデータキー AWS Encryption SDK を使用してデータを暗号化した後、できるだけ早くメモリから削除します。その後、暗号化オペレーションで返る[暗号化されたメッセージ](#message)の暗号化されたデータを使用して、暗号化されたデータキーが保存されます。詳細については、「[の AWS Encryption SDK 仕組み](how-it-works.md)」を参照してください。

**ヒント**  
では AWS Encryption SDK、*データキー*と*データ暗号化キー*を区別します。デフォルトのスイートを含むサポートされている[アルゴリズムスイート](#crypto-algorithm)のいくつかは、データキーが暗号化の上限に到達することを防ぐ、[キー取得関数](https://en.wikipedia.org/wiki/Key_derivation_function)を使用します。キー取得関数は、データキーを入力として受け取り、データの暗号化に実際に使用されたデータ暗号化キーを返します。そのため、データは、データキー「によって」暗号化されているというよりは、データキーの「下で」暗号化されていると言えます。

暗号化された各データキーには、暗号化したラッピングキーの識別子を含むメタデータが含まれます。このメタデータにより、 は復号時に有効なラッピングキーを簡単に AWS Encryption SDK 識別できます。

## ラッピングキー
<a name="master-key"></a>

ラッピングキー はキー暗号化キーであり、 AWS Encryption SDK ではこれを使用して、データを暗号化する [データキー](#DEK) を暗号化します。それぞれのプレーンテキストのデータキーは、1 つまたは複数のラッピングキーで暗号化することができます。[キーリング](#keyring)または[マスターキープロバイダー](#master-key-provider)の設定時に、データの保護に使用するラッピングキーを決定します。

**注記**  
*ラッピングキー*は、キーリングまたはマスターキープロバイダー内のキーを参照します。*マスターキー*は一般的に、マスターキープロバイダーを使用するときにインスタンス化する `MasterKey` クラスと関連します。

は、 (AWS KMS) 対称 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) ([マルチリージョン KMS キーを含む](configure.md#config-mrks))、raw AES-GCM (Advanced Encryption Standard/Galois Counter Mode) キー、raw RSA キーなど AWS Key Management Service 、一般的に使用されるいくつかのラッピングキー AWS Encryption SDK をサポートしています。また、独自のラッピングキーを拡張または実装することもできます。

エンベロープ暗号化を使用する場合は、認可されていないアクセスからラッピングキーを保護する必要があります。これは、次のいずれかの方法で行うことができます。
+ この目的のために設計された [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) などのウェブサービスを使用します。
+ [https://en.wikipedia.org/wiki/Hardware_security_module](https://en.wikipedia.org/wiki/Hardware_security_module)[ によって提供されているようなAWS CloudHSMハードウェアセキュリティモジュール (HSM)](https://aws.amazon.com/cloudhsm/) を使用します。
+ 他のキー管理ツールやサービスを使用します。

キー管理システムがない場合は、 をお勧めします AWS KMS。は AWS Encryption SDK と統合され AWS KMS 、ラッピングキーの保護と使用に役立ちます。ただし、 AWS Encryption SDK には AWS または AWS のサービスは必要ありません。

## キーリングおよびマスターキープロバイダー
<a name="keyring"></a>

暗号化と復号に使用するラッピングキーを指定するには、キーリングまたはマスターキープロバイダーを使用します。が提供するキーリングとマスターキープロバイダーを使用する AWS Encryption SDK か、独自の実装を設計できます。 AWS Encryption SDK では、言語制約の対象となりながらも相互に互換性のあるキーリングとマスターキープロバイダーが提供されます。詳細については、「[キーリングの互換性](choose-keyring.md#keyring-compatibility)」を参照してください。

*キーリング*は、データキーの生成、暗号化、復号を行います。キーリングを定義するとき、データキーを暗号化する[ラッピングキー](#master-key)を指定できます。ほとんどのキーリングは、少なくとも 1 つのラッピングキーを指定するか、ラッピングキーを提供および保護するサービスを指定します。追加の設定オプションを使用して、ラッピングキーのないキーリングや、より複雑なキーリングを定義することもできます。が AWS Encryption SDK 定義するキーリングの選択と使用については、「」を参照してください[キーリング](choose-keyring.md)。

キーリングは、次のプログラミング言語でサポートされています。
+ AWS Encryption SDK for C
+ AWS Encryption SDK for JavaScript
+ AWS Encryption SDK .NET 用
+ のバージョン 3.*x* AWS Encryption SDK for Java
+ オプションの [Cryptographic Material Providers Library](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 依存関係とともに使用する場合の AWS Encryption SDK for Pythonのバージョン 4.*x*。
+  AWS Encryption SDK for Rust のバージョン 1.*x* 
+  AWS Encryption SDK for Go のバージョン 0.1.*x* 以降

*マスターキープロバイダー*はキーリングの代替品です。マスターキープロバイダーは、指定したラッピングキー (またはマスターキー) を返します。各マスターキーは 1 つのマスターキープロバイダーに関連付けられていますが、マスターキープロバイダーは通常複数のマスターキーを提供しています。マスターキープロバイダーは、Java、Python、および AWS Encryption CLI でサポートされています。

暗号化には、キーリング (またはマスターキープロバイダー) を指定する必要があります。復号化には、同じキーリング (またはマスターキープロバイダー) を指定することも、別のキーリングを指定することもできます。暗号化時に、 AWS Encryption SDK は指定したすべてのラッピングキーを使用してデータキーを暗号化します。復号化するとき、 AWS Encryption SDK では、指定したラッピングキーのみを使用して、暗号化されたデータキーを復号します。復号化のラッピングキーの指定はオプションですが、 AWS Encryption SDK [ベストプラクティス](best-practices.md)です。

ラッピングキーの指定の詳細については、「[ラッピングキーの選択](configure.md#config-keys)」を参照してください。

## 暗号化コンテキスト
<a name="encryption-context"></a>

暗号化オペレーションのセキュリティを向上させるには、データを暗号化するためのすべてのリクエストに暗号化コンテキストを含めます。暗号化コンテキストの使用はオプションですが、暗号化のベストプラクティスとして使用することをお勧めします。

*暗号化コンテキスト*は、任意のシークレットではない追加認証データを含む名前と値のペアのセットです。暗号化コンテキストには選択した任意のデータを含むことができますが、一般的には、ファイルの種類、目的、または所有権などの、ログ記録と追跡に有用なデータが含まれます。データを暗号化する場合、暗号化コンテキストは暗号化されたデータに暗号化されてバインドされます。これにより、データを復号するために同じ暗号化コンテキストが必要になります。 AWS Encryption SDK より返る[暗号化されたメッセージ](#message)のヘッダーには、プレーンテキストの暗号化コンテキストが含まれます。

が AWS Encryption SDK 使用する暗号化コンテキストは、指定した暗号化コンテキストと、[暗号化マテリアルマネージャー](#crypt-materials-manager) (CMM) が追加するパブリックキーペアで構成されます。具体的には、[署名付きの暗号化アルゴリズム](algorithms-reference.md)を使用する度に、予約名 `aws-crypto-public-key` と、パブリック検証キーを表す値で構成される暗号化コンテキストに名前と値のペアが CMM によって追加されます。暗号化コンテキスト`aws-crypto-public-key`の名前は によって予約 AWS Encryption SDK され、暗号化コンテキストの他のペアの名前として使用することはできません。詳細については、*メッセージ形式リファレンス*の「[AAD](message-format.md#header-aad)」を参照してください。

以下の暗号化コンテキストの例は、リクエストで指定した 2 つの暗号化コンテキストペアと、CMM によって追加されるパブリックキーのペアで構成されます。

```
"Purpose"="Test", "Department"="IT", aws-crypto-public-key=<public key>
```

データを復号するには、暗号化されたメッセージを渡します。は暗号化されたメッセージヘッダーから暗号化コンテキストを抽出 AWS Encryption SDK できるため、暗号化コンテキストを個別に指定する必要はありません。ただし、暗号化コンテキストは、暗号化された適切なメッセージを復号していることを確認するのに役立ちます。
+ [AWS Encryption SDK コマンドラインインターフェイス](crypto-cli.md) (CKI) において、復号コマンドで暗号化コンテキストを指定した場合、CLI で、プレーンテキストのデータが返る前に、暗号化されたメッセージの暗号化コンテキストにその値が存在することが検証されます。
+ 他のプログラミング言語実装では、復号レスポンスに暗号化コンテキストとプレーンテキストデータが含まれます。アプリケーションの復号関数では、プレーンテキストデータを返す前に、復号レスポンスの暗号化コンテキストに暗号化リクスとの暗号化コンテキスト (またはサブセット) が含まれていることを常に確認する必要があります。

**注記**  
次のバージョンでは、[必要な暗号化コンテキスト CMM](configure.md#config-required-encryption-context-cmm) がサポートされています。これを使用して、すべての暗号化リクエストで暗号化コンテキストを要求できます。  
のバージョン 3.*x* AWS Encryption SDK for Java
 AWS Encryption SDK for .NET のバージョン 4.*x* 以降
オプションの [Cryptographic Material Providers Library](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 依存関係とともに使用する場合の AWS Encryption SDK for Pythonのバージョン 4.*x*。
 AWS Encryption SDK for Rust のバージョン 1.*x* 
 AWS Encryption SDK for Go のバージョン 0.1.*x* 以降

暗号化コンテキストを選択する際、シークレットではないことに注意してください。暗号化コンテキストは、 AWS Encryption SDK が返す[暗号化されたメッセージ](#message)のヘッダーのプレーンテキストに表示されます。を使用している場合 AWS Key Management Serviceは、 などの監査レコードやログに暗号化コンテキストがプレーンテキストで表示されることもあります AWS CloudTrail。

コード内の暗号化コンテキストを送信および検証する例については、使用している[プログラミング言語](programming-languages.md)の例を参照してください。

## 暗号化されたメッセージ
<a name="message"></a>

でデータを暗号化すると AWS Encryption SDK、暗号化されたメッセージが返されます。

*暗号化されたメッセージ*は、データキーの暗号化されたコピーと共に暗号化されたデータを含む、小型で[書式設定されたデータ構造](message-format.md)、アルゴリズム ID、および必要に応じて[暗号化コンテキスト](#encryption-context)と[デジタル署名](#digital-sigs)です。 AWS Encryption SDK の暗号化オペレーションは暗号化されたメッセージを返し、復号オペレーションは暗号化されたメッセージを入力として受け取ります。

暗号化されたデータとその暗号化されたデータキーを組み合わせることで、復号オペレーションを合理化し、暗号化するデータから暗号化されたデータキーを個別に保存して管理する必要がなくなります。

暗号化されたメッセージに関する技術情報については、「[暗号化されたメッセージの形式](message-format.md)」を参照してください。

## アルゴリズムスイート
<a name="crypto-algorithm"></a>

はアルゴリズムスイート AWS Encryption SDK を使用して、暗号化および復号オペレーションが返す[暗号化されたメッセージ](#message)内のデータを暗号化および署名します。 AWS Encryption SDK では、いくつかの[アルゴリズムスイート](supported-algorithms.md)がサポートされています。サポートされているすべてのスイートは、Advanced Encryption Standard (AES) を主なアルゴリズムとして、他のアルゴリズムや値と組み合わせて使用します。

は、すべての暗号化オペレーションのデフォルトとして推奨アルゴリズムスイート AWS Encryption SDK を確立します。標準とベストプラクティスの向上に伴い、デフォルトは変更される可能性があります。データの暗号化リクエスト内、または[暗号化マテリアルマネージャー (CMM)](#crypt-materials-manager) の作成時に、代替のアルゴリズムスイートを指定できます。ただし、状況からして代替が必須でない限り、デフォルトを使用することをお勧めします。現在のデフォルトは、HMAC ベースの抽出および展開[キー取得関数](https://en.wikipedia.org/wiki/HKDF) ([HKDF](https://en.wikipedia.org/wiki/HKDF)) を使用する AES-GCM、[キーコミットメント](#key-commitment)、[楕円曲線 DSA (ECDSA)](#digital-sigs) 署名、256 ビット暗号化キーです。

アプリケーションで高いパフォーマンスを必要とし、データを暗号化するユーザーとデータを復号化するユーザーが同等に信頼できる場合は、デジタル署名のないアルゴリズムスイートを指定することを検討してください。ただし、キーコミットメントとキー取得関数を含むアルゴリズムスイートを強くお勧めします。これらの機能のないアルゴリズムスイート機能は、下位互換性のためにのみサポートされています。

## 暗号化マテリアルマネージャー
<a name="crypt-materials-manager"></a>

暗号化マテリアルマネージャー (CMM) は、データの暗号化と復号化に使用される暗号化マテリアルを組み立てます。*暗号化マテリアル*には、プレーンテキストおよび暗号化されたデータキー、オプションのメッセージ署名キーが含まれます。CMM を直接操作することは決してありません。このためには、暗号化メソッドおよび復号メソッドを使用します。

 AWS Encryption SDK が提供するデフォルトの CMM または[キャッシュ CMM ](data-key-caching.md)を使用するか、カスタム CMM を記述できます。CMM は指定できますが、必須ではありません。キーリングまたはマスターキープロバイダーを指定すると、 によってデフォルトの CMM AWS Encryption SDK が作成されます。デフォルトの CMM は、指定したキーリングまたはマスターキープロバイダーから暗号化マテリアルまたは復号マテリアルを取得します。これには、[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) などの暗号化サービスの呼び出しが含まれる場合があります。

CMM は AWS Encryption SDK とキーリング (またはマスターキープロバイダー) の間の連絡係として機能するため、ポリシーの適用やキャッシュのサポートなど、カスタマイズや拡張に理想的なポイントです。は、データキーキャッシュをサポートするキャッシュ CMM AWS Encryption SDK を提供します。 [データキーキャッシュ](data-key-caching.md)

## 対称暗号化と非対称暗号化
<a name="symmetric-key-encryption"></a>

*対称暗号化*では、データの暗号化と復号化に同じキーが使用されます。

*非対称暗号化*では、数学的に関連するデータキーペアが使用されます。ペアの 1 つのキーでデータが暗号化され、ペアの他のキーだけでデータが復号されます。

はエン[ベロープ暗号化](#envelope-encryption) AWS Encryption SDK を使用します。データは対称データキーで暗号化されます。対称データキーを 1 つ以上の対称または非対称のラッピングキーで暗号化します。返される[暗号化されたメッセージ](#message)には、暗号化されたデータおよび少なくとも 1 つの暗号化されたデータキーのコピーが含まれます。

**データの暗号化 (対称暗号化)**  
データを暗号化するために、 は対称[データキー](#DEK)と、対称暗号化[アルゴリズムを含むアルゴリズムスイート](#crypto-algorithm) AWS Encryption SDK を使用します。データを復号するために、 は同じデータキーと同じアルゴリズムスイート AWS Encryption SDK を使用します。

**データキーの暗号化 (対称暗号化または非対称暗号化)**  
暗号化および復号化のオペレーションに指定する[キーリング](#keyring)または[マスターキープロバイダー](#master-key-provider)により、対称データキーの暗号化および復号化方法が決まります。キーリングなどの対称暗号化を使用するキーリングまたはマスター AWS KMS キープロバイダー、または raw RSA キーリングや などの非対称暗号化を使用するキーリングまたはマスターキープロバイダーを選択できます`JceMasterKey`。

## キーコミットメント
<a name="key-commitment"></a>

は*、キーコミットメント* (*堅牢性*とも呼ばれます) AWS Encryption SDK をサポートしています。これは、各暗号文を 1 つのプレーンテキストにのみ復号化できることを保証するセキュリティプロパティです。これを行うために、キーコミットメントでは、メッセージを暗号化したデータキーのみが復号化に使用されることが保証されます。キーコミットメントによる暗号化と復号化は、[AWS Encryption SDK のベストプラクティス](best-practices.md)です。

最新の対称暗号 (AES を含む) では、 AWS Encryption SDK が各プレーンテキストメッセージの暗号化に使用する、[一意のデータキー](#DEK)などの単一のシークレットキーでプレーンテキストが暗号化されます。同じデータキーでこのデータを復号すると、元のデータと同じプレーンテキストが返されます。別のキーで復号化すると、通常は失敗します。ただし、2 つの異なるキーで暗号化テキストを復号化することは可能です。まれに、数バイトの暗号化テキストを別の理解可能なプレーンテキストに復号化できるキーを見つけることは可能です。

は常に AWS Encryption SDK 1 つの一意のデータキーで各プレーンテキストメッセージを暗号化します。複数のラッピングキー (またはマスターキー) でそのデータキーを暗号化する場合がありますが、ラッピングキーは常に同じデータキーを暗号化します。ただし、手動で作成した高度な[暗号化されたメッセージ](#message)には、実際には異なるデータキーが含まれて、それぞれ異なるラッピングキーによって暗号化されることがあります。例えば、あるユーザーが暗号化されたメッセージを復号すると 0x0 (false) を返し、同じ暗号化されたメッセージを別のユーザーが復号すると 0x1 (true) となることがあります。

このシナリオを防ぐために、 は暗号化および復号時のキーコミットメント AWS Encryption SDK をサポートします。がキーコミットメントでメッセージを AWS Encryption SDK 暗号化すると、暗号文を生成した一意のデータキーを、シークレット以外のデータキー識別子である*キーコミットメント文字列*に暗号的にバインドします。その後、キーコミットメント文字列は、暗号化されたメッセージのメタデータに保存されます。キーコミットメントを使用してメッセージを復号すると、 AWS Encryption SDK はデータキーがその暗号化されたメッセージの唯一のキーであることを確認します。データキーの検証が失敗すると、復号オペレーションは失敗します。

キーコミットメントのサポートは、バージョン 1.7.*x* で導入されました。このバージョンではキーコミットメントでメッセージを復号化できますが、キーコミットメントによる暗号化はできません。このバージョンを使用して、キーコミットメントで暗号化テキストを復号化する機能を完全にデプロイできます。バージョン 2.0.*x* では、キーコミットメントが完全にサポートされます。デフォルトでは、キーコミットメントでのみ暗号化および復号化が行われます。これは、 の以前のバージョンで暗号化された暗号文を復号する必要がないアプリケーションに最適です AWS Encryption SDK。

キーコミットメントによる暗号化と復号化がベストプラクティスですが、使用時期を決定し、それを採用するペースを調整できます。バージョン 1.7.*x* 以降、 は[デフォルトのアルゴリズムスイート](supported-algorithms.md)を設定し、使用できるアルゴリズムスイートを制限する[コミットメントポリシー](#commitment-policy) AWS Encryption SDK をサポートしています。このポリシーにより、データをキーコミットメントで暗号化および復号化するかどうかが決まります。

キーコミットメントでは、[暗号化メッセージがわずかに大きくなり (\$1 30 バイト)](message-format.md)、処理に時間がかかります。アプリケーションでサイズやパフォーマンスに注意が必要である場合は、キーコミットメントをオプトアウトすることもできます。しかし、必要である場合にのみオプトアウトしてください。

バージョン 1.7.*x* および 2.0.*x* への移行、およびキーコミットメント機能に関する詳細については、[の移行 AWS Encryption SDK](migration.md) を参照してください。キーコミットメントに関する技術情報については、[AWS Encryption SDK アルゴリズムリファレンス](algorithms-reference.md) および [AWS Encryption SDK メッセージ形式のリファレンス](message-format.md) を参照してください。

## コミットメントポリシー
<a name="commitment-policy"></a>

*コミットメントポリシー*は、アプリケーションが[キーコミットメント](#key-commitment)で暗号化および復号化を行うかどうかを決定する構成設定です。キーコミットメントによる暗号化と復号化は、[AWS Encryption SDK のベストプラクティス](best-practices.md)です。

コミットメントポリシーには 3 つの値があります。

**注記**  
テーブル全体を表示するには、水平または垂直にスクロールする必要があります。


**コミットメントポリシーの値**  

| 値 | キーコミットメントで暗号化 | キーコミットメントなしで暗号化 | キーコミットメントで復号化 | キーコミットメントなしで復号化 | 
| --- | --- | --- | --- | --- | 
| ForbidEncryptAllowDecrypt | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptAllowDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptRequireDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png) | 

コミットメントポリシー設定は AWS Encryption SDK バージョン 1.7.*x* で導入されました。すべてのサポート対象[プログラミング言語](programming-languages.md)で有効です。
+ `ForbidEncryptAllowDecrypt` は、キーコミットメントの有無にかかわらず復号しますが、キーコミットメントでは暗号化しません。この値は、バージョン 1.7.*x* で導入され、アプリケーションを実行しているすべてのホストがキーコミットメントで暗号化された暗号文に遭遇する前に、キーコミットメントで復号する準備をするように設計されています。
+ `RequireEncryptAllowDecrypt` では常にキーコミットメントで暗号化されます。復号化は、キーコミットメントが使用されているかどうかにかかわらず可能です。バージョン 2.0.*x* で導入されたこの値では、キーコミットメントによる暗号化を開始できますが、キーコミットメントによらない従来の暗号化テキストを復号化できます。
+ `RequireEncryptRequireDecrypt` では、キーコミットメントでのみ暗号化および復号化が行われます。この値がバージョン 2.0.*x* のデフォルトです。この値は、すべての暗号化テキストがキーコミットメントで暗号化されていることが確実な場合に使用します。

コミットメントポリシー設定により、使用できるアルゴリズムスイートが決まります。バージョン 1.7.*x* 以降、 は、署名の有無にかかわらず、キーコミットメントの[アルゴリズムスイート](supported-algorithms.md) AWS Encryption SDK をサポートしています。コミットメントポリシーと競合するアルゴリズムスイートを指定した場合、 AWS Encryption SDK はエラーを返します。

コミットメントポリシーの設定については、[コミットメントポリシーの設定](migrate-commitment-policy.md) を参照してください。

## デジタル署名
<a name="digital-sigs"></a>

は、認証された AWS Encryption SDK 暗号化アルゴリズム、AES-GCM、および復号プロセスを使用してデータを暗号化し、デジタル署名を使用せずに暗号化されたメッセージの整合性と信頼性を検証します。しかし、AES-GCM は対称キーを使用するため、暗号化テキストの復号化に使用されるデータキーを復号できる人は誰でも、新しい暗号化された暗号化テキストを手動で作成できるようになり、セキュリティ上の懸念が生じる可能性があります。たとえば、 をラッピングキー AWS KMS key として使用すると、 アクセス`kms:Decrypt`許可を持つユーザーは、 を呼び出すことなく暗号化された暗号文を作成できます`kms:Encrypt`。

この問題を回避するため、 では、暗号化されたメッセージの末尾に楕円曲線デジタル署名アルゴリズム (ECDSA) 署名の追加 AWS Encryption SDK がサポートされています。署名アルゴリズムスイートを使用すると、 は暗号化されたメッセージごとに一時的なプライベートキーとパブリックキーのペア AWS Encryption SDK を生成します。は AWS Encryption SDK 、パブリックキーをデータキーの暗号化コンテキストに保存し、プライベートキーを破棄します。これにより、パブリックキーで検証する別の署名を誰も作成できなくなります。このアルゴリズムは、暗号化されたデータキーをメッセージヘッダー内の追加の認証済みデータとしてバインドし、メッセージを復号化できるユーザーがパブリックキーを変更したり、署名の検証に影響を与えたりするのを防ぎます。

署名の検証では、復号化に大きなパフォーマンスコストがかかります。データを暗号化するユーザーとデータを復号化するユーザーが同等に信頼されている場合は、署名を含まないアルゴリズムスイートの使用を検討してください。

**注記**  
キーリングまたはラッピング暗号化マテリアルへのアクセスがエンクリプタと復号器の間で区別されない場合、デジタル署名は暗号化値を提供しません。

非対称 RSA [AWS KMS キーリング](use-kms-keyring.md)を含む AWS KMS キーリングは、 AWS KMS キーポリシーと IAM ポリシーに基づいて、エンクリプタと復号器を区別できます。

暗号化の性質上、次のキーリングは暗号化子と復号子を区別できません。
+ AWS KMS 階層キーリング
+ AWS KMS ECDH キーリング
+ Raw AES キーリング
+ Raw RSA キーリング
+ Raw ECDH キーリング

# の AWS Encryption SDK 仕組み
<a name="how-it-works"></a>

このセクションのワークフローでは、 AWS Encryption SDK がデータを暗号化し、[暗号化されたメッセージを](concepts.md#message)復号する方法について説明します。これらのワークフローは、デフォルト機能を使用した基本的なプロセスを表します。カスタムコンポーネントの定義と使用の詳細については、サポートされているそれぞれの[言語実装](programming-languages.md)の GitHub リポジトリを参照してください。

 AWS Encryption SDK は、エンベロープ暗号化を使用してデータを保護します。各メッセージは、一意のデータキーで暗号化されます。その後、データキーは指定したラッピングキーにより暗号化されます。暗号化されたメッセージを復号するために、 AWS Encryption SDK は、指定したラッピングキーを使用して、少なくとも 1 つの暗号化されたデータキーを復号します。その後、暗号文を復号化してプレーンテキストのメッセージを返すことができます。

「 AWS Encryption SDK」で使われている用語についてサポートが必要ですか? 「[の概念 AWS Encryption SDK](concepts.md)」を参照してください。

## がデータを AWS Encryption SDK 暗号化する方法
<a name="encrypt-workflow"></a>

 AWS Encryption SDK には、文字列、バイト配列、バイトストリームを暗号化するメソッドが用意されています。コードの例については、各 [プログラミング言語](programming-languages.md) セクションの「例」トピックを参照してください。

1. データを保護するラッピングキーを指定する [キーリング](choose-keyring.md) (または [マスターキープロバイダー](concepts.md#master-key-provider)) を作成します。

1. キーリングとプレーンテキストのデータを暗号化メソッドに渡します。シークレットではないオプションの [暗号化コンテキスト](concepts.md#encryption-context) で渡すことをお勧めします。

1. 暗号化メソッドによって、キーリングに暗号化マテリアルが求められます。キーリングは、メッセージの一意のデータ暗号化キーを返します。1 つのプレーンテキストデータキーと、指定された各ラッピングキーによって暗号化されたそのデータキーのコピーです。

1. 暗号化方法は、プレーンテキストデータキーを使用してデータを暗号化し、プレーンテキストのデータキーを破棄します。暗号化コンテキスト ( AWS Encryption SDK [ベストプラクティス](best-practices.md)) を指定すると、暗号化メソッドは暗号化コンテキストを暗号化データに暗号的に結合します。

1. 暗号化メソッドによって、暗号化されたデータ、暗号化されたデータキー、使用した場合は暗号化コンテキストなどの他の暗号化されたデータを含む [暗号化されたメッセージ](concepts.md#message) が返ります。

## が暗号化されたメッセージを AWS Encryption SDK 復号する方法
<a name="decrypt-workflow"></a>

 AWS Encryption SDK には、[暗号化されたメッセージを](concepts.md#message)復号し、プレーンテキストを返すメソッドが用意されています。コードの例については、各 [プログラミング言語](programming-languages.md) セクションの「例」トピックを参照してください。

暗号化されたメッセージを復号化する [キーリング](choose-keyring.md) (または [マスターキープロバイダー](concepts.md#master-key-provider)) は、メッセージの暗号化に使用されたキーリング (またはマスターキープロバイダー) と互換性がある必要があります。ラッピングキーのいずれか 1 つが暗号化されたメッセージの暗号化されたデータキーを復号できる必要があります。キーリングとマスターキープロバイダとの互換性については、「[キーリングの互換性](choose-keyring.md#keyring-compatibility)」を参照してください。

1. データを復号できるラッピングキーを使用して、キーリングまたはマスターキープロバイダーを作成します。暗号化メソッドに提供ものと同じキーリングを使用するか、別のキーリングを使用することもできます。

1. [暗号化されたメッセージ](concepts.md#message) とキーリングを復号化メソッドに渡します。

1. 復号の方法では、キーリングまたはマスターキープロバイダーに、暗号化されたメッセージの暗号化されたデータキーのいずれかを復号するように要求します。　 次に、暗号化されたメッセージから、暗号化されたデータキーなどの情報を渡します。

1. キーリングは、そのラッピングキーを使用して、暗号化されたデータキーのいずれかを復号します。成功した場合、レスポンスにはプレーンテキストのデータキーが含まれます。キーリングまたはマスターキープロバイダーによって指定されたラッピングキーのいずれも暗号化されたデータキーを復号化できない場合、復号の呼び出しは失敗します。　

1. 復号方法は、プレーンテキストデータキーを使用してデータを復号し、プレーンテキストのデータキーを破棄します。　

# でサポートされているアルゴリズムスイート AWS Encryption SDK
<a name="supported-algorithms"></a>

*アルゴリズムスイート*は、暗号化アルゴリズムと関連する値の集合です。暗号化システムは、アルゴリズムの実装を使用して、暗号化テキストメッセージを生成します。

 AWS Encryption SDK アルゴリズムスイートは、AES-GCM と呼ばれる Galois/Counter Mode (GCM) の Advanced Encryption Standard (AES) アルゴリズムを使用して生データを暗号化します。は、256 ビット、192 ビット、および 128 ビットの暗号化キー AWS Encryption SDK をサポートしています。初期化ベクトル (IV) の長さは常に 12 バイトです。認証タグの長さは常に 16 バイトです。

デフォルトでは、 は HMAC ベースのextract-and-expandキー取得関数 ([HKDF](https://en.wikipedia.org/wiki/HKDF))、署名、および 256 ビット暗号化キーを持つ AES-GCM のアルゴリズムスイート AWS Encryption SDK を使用します。[コミットメントポリシー](concepts.md#commitment-policy)に[キーコミットメント](concepts.md#key-commitment)が必要な場合、 はキーコミットメントもサポートするアルゴリズムスイート AWS Encryption SDK を選択します。それ以外の場合は、キー取得と署名を含むアルゴリズムスイートを選択しますが、キーコミットメントは選択しません。

## 推奨: キー取得、署名、キーコミットメントを使用する AES-GCM
<a name="recommended-algorithms"></a>

では、256 ビットのデータ暗号化キーを HMAC ベースのextract-and-expandキー取得関数 (HKDF) に提供して AES-GCM 暗号化キーを取得するアルゴリズムスイート AWS Encryption SDK を推奨しています。は、楕円曲線デジタル署名アルゴリズム (ECDSA) 署名 AWS Encryption SDK を追加します。[キーコミットメント](concepts.md#key-commitment)をサポートするため、このアルゴリズムスイートは、暗号化されたメッセージのメタデータに保存されている*キーコミットメント文字列* (シークレット以外のデータキー識別子) も取得します。このキーコミットメント文字列は、データ暗号化キーの取得と同様の手順を使用して HKDF によっても取得されます。


**AWS Encryption SDK アルゴリズムスイート**  

| 暗号化アルゴリズム | データ暗号化キーの長さ (ビット) | キー導出アルゴリズム | 署名アルゴリズム | キーコミットメント | 
| --- | --- | --- | --- | --- | 
| AES-GCM | 256 | SHA-384 を使用する HKDF | P-384 および SHA-384 を使用する ECDSA | SHA-512 を使用する HKDF | 

HKDF により、データ暗号化キーの誤った再利用を避けて、データキー乱用のリスクを軽減できます。

署名のために、このアルゴリズムスイートは、暗号化ハッシュ関数アルゴリズム (SHA-384) を含む ECDSA を使用します。基盤となるマスターキーのポリシーによって指定されていない場合でも、ECDSA が、デフォルトで使用されます。[メッセージ署名](concepts.md#digital-sigs)では、メッセージの送信者がメッセージを暗号化する権限があることが検証され、非否認が可能になります。これは、マスターキーの承認ポリシーによって、1 組のユーザーにデータを暗号化させ、別の組のユーザーにデータを復号させる場合に特に便利です。

キーコミットメントを使用するアルゴリズムスイートでは、各暗号化テキストが 1 つのプレーンテキストのみに復号化されるようになります。これは、暗号化アルゴリズムへの入力として使用されるデータキーの ID を検証することによって行います。暗号化時に、これらのアルゴリズムスイートはキーコミットメント文字列を取得します。復号する前には、データキーがキーコミットメント文字列と一致することが検証されます。一致しない場合、復号呼び出しは失敗します。

## サポートされているその他のアルゴリズムスイート
<a name="other-algorithms"></a>

は、下位互換性のために次の代替アルゴリズムスイート AWS Encryption SDK をサポートしています。一般的に、これらのアルゴリズムスイートはお勧めしていません。ただし、署名がパフォーマンスを大幅に低下させる可能性があることが分かっているため、このようなケースのためにキー取得を使用するキーコミットスイートが提供されています。より重大なパフォーマンスのトレードオフを行う必要があるアプリケーションのために、署名、キーコミットメント、キー取得がないスイートが引き続き提供されます。

**キーコミットメントを使用しない AES-GCM**  
キーコミットメントを使用しないアルゴリズムスイートでは、復号化前にデータキーが検証されません。その結果、これらのアルゴリズムスイートでは、単一の暗号化テキストがさまざまなプレーンテキストメッセージに復号化されることがあります。ただし、キーコミットメントを使用するアルゴリズムスイートでは、[暗号化されたメッセージがわずかに大きくなって (\$130 バイト)](message-format.md) 処理に時間がかかるため、すべてのアプリケーションに最適な選択肢ではない場合があります。  
は、キー取得、キーコミットメント、署名、およびキー取得とキーコミットメントを持つアルゴリズムスイート AWS Encryption SDK をサポートしますが、署名はサポートしていません。キーコミットメントを使用しないアルゴリズムスイートを使用することはお勧めしません。必要な場合は、キー取得とキーコミットメントを使用するが、署名を使用しないアルゴリズムスイートをお勧めします。ただし、アプリケーションパフォーマンスプロファイルがアルゴリズムスイートの使用をサポートしている場合は、キーコミットメント、キー取得、および署名を使用するアルゴリズムスイートを使用することがベストプラクティスです。

**署名を使用しない AES-GCM**  
署名を使用しないアルゴリズムスイートには、信頼性と非否認を提供する ECDSA 署名がありません。これらのスイートは、データを暗号化するユーザーと復号するユーザーが同じほど信頼できる場合に使用します。  
署名を使用しないアルゴリズムスイートを使用するときは、キー取得とキーコミットメントを使用するアルゴリズムスイートの選択をお勧めします。

**キー取得を使用しない AES-GCM**  
キー取得を使用しないアルゴリズムスイートは、キー取得関数ではなく、AES-GCM 暗号化キーとしてデータ暗号化キーを使用して、一意のキーを取得します。このスイートを使用して暗号文を生成することはお勧めしませんが、 は互換性の理由から AWS Encryption SDK サポートしています。

これらのスイートのライブラリ内での表示方法と使用方法の詳細については、「[AWS Encryption SDK アルゴリズムリファレンス](algorithms-reference.md)」を参照してください。