Raw RSA キーリング - AWS Encryption SDK

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

Raw RSA キーリング

Raw RSA キーリングは、指定した RSA パブリックキーとプライベートキーを使用して、ローカルメモリでデータキーの非対称の暗号化と復号を行います。プライベートキーを生成、格納、保護する必要があります (ハードウェアセキュリティモジュール (HSM) またはキー管理システムで行うのが好ましいです)。暗号化関数を使用して、RSA パブリックキーのデータキーを暗号化します。復号関数でプライベートキーを使用して、データキーを復号します。複数の RSA パディングモードから選択できます。

暗号化と復号を行う Raw RSA キーリングには、非対称のパブリックキーとプライベートキーのペアを含める必要があります。ただし、データの暗号化は、パブリックキーのみを持つ Raw RSA キーリングを使用して行うことができます。また、データの復号は、プライベートキーのみを持つ Raw RSA キーリングを使用して行うことができます。Raw RSA キーリングは、マルチキーリングに含めることができます。Raw RSA キーリングをパブリックキーおよびプライベートキーを使用して設定する場合は、それらが同じキーペアの一部であることを確認してください。の一部の言語実装 AWS Encryption SDK では、異なるペアのキーを持つ Raw RSA キーリングは構築されません。他の人は、キーがが同じキーペアであることを確認することを頼っています。

Raw RSA キーリングは、RSA 非対称暗号化キーとともに使用する場合、 の JceMasterKey AWS Encryption SDK for Java および の RawMasterKey と同等であり、相互運用 AWS Encryption SDK for Python されます。ある実装でデータを暗号化し、それを他の実装で、同じラッピングキーを使用して復号することができます。詳細については、「キーリングの互換性」を参照してください。

注記

Raw RSA キーリングは非対称 KMS キーをサポートしていません。非対称 RSA KMS キーを使用する場合、次のプログラミング言語は非対称 RSA を使用する AWS KMS キーリングをサポートします AWS KMS keys。

  • のバージョン 3.x AWS Encryption SDK for Java

  • .NET AWS Encryption SDK 用 のバージョン 4.x

  • オプションの Cryptographic Material Providers Library (MPL) 依存関係で使用する AWS Encryption SDK for Python場合のバージョン 4.x

  • AWS Encryption SDK for Go のバージョン 0.1.x 以降

RSA KMS キーのパブリックキーを含む Raw RSA キーリングでデータを暗号化する場合、 AWS Encryption SDK も もデータを復号 AWS KMS できません。 AWS KMS 非対称 KMS キーのプライベートキーを Raw RSA キーリングにエクスポートすることはできません。 AWS KMS Decrypt オペレーションでは、 が AWS Encryption SDK 返す暗号化されたメッセージを復号できません。

で Raw RSA キーリングを構築するときは AWS Encryption SDK for C、パスやファイル名ではなく、null で終了された C 文字列として各キーを含む PEM ファイルの内容を必ず指定してください。JavaScript で Raw RSA キーリングを作成する場合は、他の言語の実装との互換性が失われる可能性があることに注意してください。

名前空間と名前

キーリング内の RSA キーマテリアルを識別するために、Raw RSA キーリングは、指定したキーの名前空間とキー名を使用します。これらの値はシークレットではありません。これらは、暗号化オペレーションが返す 暗号化されたメッセージ のヘッダーにプレーンテキストで表示されます。HSM またはキー管理システムの RSA キーペア (またはそのプライベートキー) を識別するキーの名前空間とキー名を使用することをお勧めします。

注記

キーの名前空間とキー名は、JceMasterKeyRawMasterKey のプロバイダー ID (またはプロバイダー) とキー ID フィールドに相当します。

は、KMS aws-kmsキーのキー名前空間値 AWS Encryption SDK for C を予約します。 AWS Encryption SDK for Cの Raw AES キーリングや Raw RSA キーリングには使用しないでください。

特定のメッセージを暗号化および復号化するために異なるキーリングを作成する場合、名前空間と名前の値は重要です。復号キーリング内のキー名前空間とキー名が、暗号化キーリング内のキー名前空間とキー名と大文字と小文字を区別して完全に一致しない場合、キーが同じキーペアであっても、復号キーリングは使用されません。

暗号化および復号キーリング内のキーマテリアルのキーの名前空間とキー名は、キーリングのキーペアに RSA パブリックキー、RSA プライベートキー、または両方のキーが含まれているかどうかにかかわらず、同じである必要があります。例えば、キーの名前空間 HSM_01 とキー名 RSA_2048_06 を持つ RSA パブリックキーの Raw RSA キーリングを使用してデータを暗号化するとします。そのデータを復号するには、プライベートキー (またはキーペア)、および同じキーの名前空間と名前を使用して Raw RSA キーリングを構築します。

パディングモード

暗号化と復号に使用される Raw RSA キーリングのためにパディングモードを指定するか、またはそれを指定する言語実装の機能を使用する必要があります。

は、各言語の制約に従い、次のパディングモード AWS Encryption SDK をサポートしています。OAEP パディングモード、特に SHA-256 を使用する OAEP および SHA-256 パディングを使用する MGF1 をお勧めします。PKCS1 パディングモードは、下位互換性のためのみサポートされています。

  • SHA-1 を使用する OAEP および SHA-1 パディングを使用する MGF1

  • SHA-256 を使用する OAEP および SHA-256 パディングを使用する MGF1

  • SHA-384 を使用する OAEP および SHA-384 パディングを使用する MGF1

  • SHA-512 を使用する OAEP および SHA-512 パディングを使用する MGF1

  • PKCS1 v1.5 パディング

次の例は、RSA キーペアのパブリックキーとプライベートキーを使用して Raw RSA キーリングを作成し、SHA-256 パディングモードで OAEP を SHA-256 パディングモードで MGF1 を作成する方法を示しています。RSAPublicKey および RSAPrivateKey 変数は、指定するキーマテリアルを表します。

C

で Raw RSA キーリングを作成するには AWS Encryption SDK for C、 を使用しますaws_cryptosdk_raw_rsa_keyring_new

で Raw RSA キーリングを構築するときは AWS Encryption SDK for C、パスやファイル名ではなく、null で終了された C 文字列として各キーを含む PEM ファイルの内容を必ず指定してください。完全な例については、「raw_rsa_keyring.c」を参照してください。

struct aws_allocator *alloc = aws_default_allocator(); AWS_STATIC_STRING_FROM_LITERAL(key_namespace, "HSM_01"); AWS_STATIC_STRING_FROM_LITERAL(key_name, "RSA_2048_06"); struct aws_cryptosdk_keyring *rawRsaKeyring = aws_cryptosdk_raw_rsa_keyring_new( alloc, key_namespace, key_name, private_key_from_pem, public_key_from_pem, AWS_CRYPTOSDK_RSA_OAEP_SHA256_MGF1);
C# / .NET

for .NET で Raw RSA AWS Encryption SDK キーリングをインスタンス化するには、 materialProviders.CreateRawRsaKeyring()メソッドを使用します。完全な例については、「RawRSAKeyringExample.cs」を参照してください。

次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用します。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); var keyNamespace = "HSM_01"; var keyName = "RSA_2048_06"; // Get public and private keys from PEM files var publicKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePublicKey.pem")); var privateKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePrivateKey.pem")); // Create the keyring input var createRawRsaKeyringInput = new CreateRawRsaKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, PaddingScheme = PaddingScheme.OAEP_SHA512_MGF1, PublicKey = publicKey, PrivateKey = privateKey }; // Create the keyring var rawRsaKeyring = materialProviders.CreateRawRsaKeyring(createRawRsaKeyringInput);
JavaScript Browser

ブラウザ AWS Encryption SDK for JavaScript の は、WebCrypto ライブラリから暗号化プリミティブを取得します。キーリングを作成する前に、importPublicKey() および / または importPrivateKey() を使用して RAW キーマテリアルを WebCrypto バックエンドにインポートする必要があります。これにより、WebCrypto へのすべての呼び出しが非同期であっても、キーリングが完成することが保証されます。インポートメソッドが受け取るオブジェクトには、ラッピングアルゴリズムとそのパディングモードが含まれます。

キーマテリアルをインポートしたら、RawRsaKeyringWebCrypto() メソッドを使用してキーリングをインスタンス化します。JavaScript で Raw RSA キーリングを作成する場合は、他の言語の実装との互換性が失われる可能性があることに注意してください。

次の例では、 buildClient関数を使用してデフォルトのコミットメントポリシー を指定しますREQUIRE_ENCRYPT_REQUIRE_DECRYPT。を使用してbuildClient、暗号化されたメッセージ内の暗号化されたデータキーの数を制限することもできます。詳細については、「暗号化されたデータキーの制限」を参照してください。

完全な例については、「rsa_simple.ts (JavaScript ブラウザ)」を参照してください。

import { RsaImportableKey, RawRsaKeyringWebCrypto, buildClient, CommitmentPolicy, } from '@aws-crypto/client-browser' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) const privateKey = await RawRsaKeyringWebCrypto.importPrivateKey( privateRsaJwKKey ) const publicKey = await RawRsaKeyringWebCrypto.importPublicKey( publicRsaJwKKey ) const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringWebCrypto({ keyName, keyNamespace, publicKey, privateKey, })
JavaScript Node.js

Node.js AWS Encryption SDK for JavaScript の で Raw RSA キーリングをインスタンス化するには、 RawRsaKeyringNodeクラスの新しいインスタンスを作成します。wrapKey パラメータはパブリックキーを保持します。unwrapKey パラメータはプライベートキーを保持します。RawRsaKeyringNode コンストラクターはデフォルトのパディングモードを自動的に計算しますが、好みのパディングモードを指定することもできます。

JavaScript で Raw RSA キーリングを作成する場合は、他の言語の実装との 非互換性の可能性 があることに注意してください。

次の例では、 buildClient関数を使用してデフォルトのコミットメントポリシー を指定しますREQUIRE_ENCRYPT_REQUIRE_DECRYPT。を使用してbuildClient、暗号化されたメッセージ内の暗号化されたデータキーの数を制限することもできます。詳細については、「暗号化されたデータキーの制限」を参照してください。

完全な例については、「rsa_simple.ts (JavaScript Node.js)」を参照してください。

import { RawRsaKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringNode({ keyName, keyNamespace, rsaPublicKey, rsaPrivateKey})
Java
final CreateRawRsaKeyringInput keyringInput = CreateRawRsaKeyringInput.builder() .keyName("RSA_2048_06") .keyNamespace("HSM_01") .paddingScheme(PaddingScheme.OAEP_SHA256_MGF1) .publicKey(RSAPublicKey) .privateKey(RSAPrivateKey) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); IKeyring rawRsaKeyring = matProv.CreateRawRsaKeyring(keyringInput);
Python

次の例では、デフォルトのコミットメントポリシー を使用して AWS Encryption SDK クライアントをインスタンス化しますREQUIRE_ENCRYPT_REQUIRE_DECRYPT。完全な例については、GitHub の AWS Encryption SDK for Python リポジトリの「raw_rsa_keyring_example.py」を参照してください。

# Define the key namespace and key name key_name_space = "HSM_01" key_name = "RSA_2048_06" # Instantiate the material providers mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create Raw RSA keyring keyring_input: CreateRawRsaKeyringInput = CreateRawRsaKeyringInput( key_namespace=key_name_space, key_name=key_name, padding_scheme=PaddingScheme.OAEP_SHA256_MGF1, public_key=RSAPublicKey, private_key=RSAPrivateKey ) raw_rsa_keyring: IKeyring = mat_prov.create_raw_rsa_keyring( input=keyring_input )
Rust
// Instantiate the AWS Encryption SDK client let esdk_config = AwsEncryptionSdkConfig::builder().build()?; let esdk_client = esdk_client::Client::from_conf(esdk_config)?; // Optional: Create an encryption context let encryption_context = HashMap::from([ ("encryption".to_string(), "context".to_string()), ("is not".to_string(), "secret".to_string()), ("but adds".to_string(), "useful metadata".to_string()), ("that can help you".to_string(), "be confident that".to_string()), ("the data you are handling".to_string(), "is what you think it is".to_string()), ]); // Define the key namespace and key name let key_namespace: &str = "HSM_01"; let key_name: &str = "RSA_2048_06"; // Instantiate the material providers library let mpl_config = MaterialProvidersConfig::builder().build()?; let mpl = mpl_client::Client::from_conf(mpl_config)?; // Create Raw RSA keyring let raw_rsa_keyring = mpl .create_raw_rsa_keyring() .key_name(key_name) .key_namespace(key_namespace) .padding_scheme(PaddingScheme::OaepSha256Mgf1) .public_key(aws_smithy_types::Blob::new(RSAPublicKey)) .private_key(aws_smithy_types::Blob::new(RSAPrivateKey)) .send() .await?;
Go
// Instantiate the material providers library matProv, err := awscryptographymaterialproviderssmithygenerated.NewClient(awscryptographymaterialproviderssmithygeneratedtypes.MaterialProvidersConfig{}) // Create Raw RSA keyring rsaKeyRingInput := awscryptographymaterialproviderssmithygeneratedtypes.CreateRawRsaKeyringInput{ KeyName: "rsa", KeyNamespace: "rsa-keyring", PaddingScheme: awscryptographymaterialproviderssmithygeneratedtypes.PaddingSchemePkcs1, PublicKey: pem.EncodeToMemory(publicKeyBlock), PrivateKey: pem.EncodeToMemory(privateKeyBlock), } rsaKeyring, err := matProv.CreateRawRsaKeyring(context.Background(), rsaKeyRingInput)
Go
import ( "context" mpl "aws/aws-cryptographic-material-providers-library/releases/go/mpl/awscryptographymaterialproviderssmithygenerated" mpltypes "aws/aws-cryptographic-material-providers-library/releases/go/mpl/awscryptographymaterialproviderssmithygeneratedtypes" client "github.com/aws/aws-encryption-sdk/awscryptographyencryptionsdksmithygenerated" esdktypes "github.com/aws/aws-encryption-sdk/awscryptographyencryptionsdksmithygeneratedtypes" ) // Instantiate the AWS Encryption SDK client encryptionClient, err := client.NewClient(esdktypes.AwsEncryptionSdkConfig{}) if err != nil { panic(err) } // Optional: Create an encryption context encryptionContext := map[string]string{ "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } // Define the key namespace and key name var keyNamespace = "HSM_01" var keyName = "RSA_2048_06" // Instantiate the material providers library matProv, err := mpl.NewClient(mpltypes.MaterialProvidersConfig{}) if err != nil { panic(err) } // Create Raw RSA keyring rsaKeyRingInput := mpltypes.CreateRawRsaKeyringInput{ KeyName: keyName, KeyNamespace: keyNamespace, PaddingScheme: mpltypes.PaddingSchemeOaepSha512Mgf1, PublicKey: (RSAPublicKey), PrivateKey: (RSAPrivateKey), } rsaKeyring, err := matProv.CreateRawRsaKeyring(context.Background(), rsaKeyRingInput) if err != nil { panic(err) }