メニュー
AWS Key Management Service
開発者ガイド

データキーの暗号化と復号化

このトピックの例では 、AWS KMS API で EncryptDecryptReEncrypt オペレーションを使用します。

これらのオペレーションは、データキーを暗号化および復号化するように設計されています。ここでは、暗号化オペレーションに AWS KMS カスタマーマスターキー (CMK) を使用しますが、4 KB (4096 bytes) 以上のデータを受け付けません。パスワードや RSA キーなどの少量データを暗号化するためにこれを使用できますが、アプリケーションデータを暗号化するために設計されていません。

アプリケーションデータを暗号化するには、AWS サービスのサーバー側の暗号化機能、あるいはクライアント側の暗号化ライブラリを使用します (AWS 暗号化 SDKAmazon S3 encryption client など)。

データキーの暗号化

暗号化 オペレーションは、データキーを暗号化するように設計されていますが、頻繁には使用されていません。GenerateDataKey および GenerateDataKeyWithoutPlaintext オペレーションは、暗号化されたデータキーを返します。暗号化されたデータを新しいリージョンに移動し、この新しいリージョンで CMK でデータキーを暗号化するときにこのメソッドを使用できます。

この例では、「クライアントの作成」で作成された kmsClient クライアントオブジェクトを使用します。

JavaC#
Java

詳細については、『AWS SDK for Java API Reference』の「encrypt メソッド」を参照してください。

// Encrypt a data key // // Replace the fictitious keyID value with a valid key ID, key ARN, or alias of an AWS CMK. String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; ByteBuffer plaintext = ByteBuffer.wrap(new byte[]{1,2,3,4,5,6,7,8,9,0}); EncryptRequest req = new EncryptRequest().withKeyId(keyId).withPlaintext(plaintext); ByteBuffer ciphertext = kmsClient.encrypt(req).getCiphertextBlob();
C#

詳細については、AWS SDK for .NET の「Encrypt メソッド」を参照してください。

// Encrypt a data key // // Replace the fictitious keyID value with a valid key ID, key ARN, or alias of an AWS CMK. String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; MemoryStream plaintext = new MemoryStream(); plaintext.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, 0, 10); EncryptRequest encryptRequest = new EncryptRequest() { KeyId = keyId, Plaintext = plaintext }; MemoryStream ciphertext = kmsClient.Encrypt(encryptRequest).CiphertextBlob;

データキーの復号化

データキーを復号するには、復号 オペレーションを使用します。

指定する ciphertextBlob は、GenerateDataKeyGenerateDataKeyWithoutPlaintext あるいは暗号化レスポンスからの CiphertextBlob フィールド値である必要があります。

この例では、「クライアントの作成」で作成された kmsClient クライアントオブジェクトを使用します。

JavaC#
Java

詳細については、『AWS SDK for Java API Reference』の「decrypt メソッド」を参照してください。

// Decrypt a data key // ByteBuffer ciphertextBlob = Place your ciphertext here; DecryptRequest req = new DecryptRequest().withCiphertextBlob(ciphertextBlob); ByteBuffer plainText = kmsClient.decrypt(req).getPlaintext();
C#

詳細については、AWS SDK for .NET の「EnableKey メソッド」を参照してください。

// Decrypt a data key // MemoryStream ciphertextBlob = new MemoryStream(); // Write ciphertext to memory stream DecryptRequest decryptRequest = new DecryptRequest() { CiphertextBlob = ciphertextBlob }; MemoryStream plainText = kmsClient.Decrypt(decryptRequest).Plaintext;

異なるカスタマーマスターキーによるデータキーの再暗号化

暗号化されたデータキーを復号し、続いてすぐに異なるカスタマーマスターキー (CMK) でデータキーを再暗号化するには、再暗号化オペレーションを使用します。このオペレーションは AWS KMS 内のサーバー側で完全に実行されるため、プレーンテキストが AWS KMS の外部に公開されることはありません。

指定する ciphertextBlob は、GenerateDataKeyGenerateDataKeyWithoutPlaintext あるいは暗号化レスポンスからの CiphertextBlob フィールド値である必要があります。

この例では、「クライアントの作成」で作成された kmsClient クライアントオブジェクトを使用します。

JavaC#
Java

詳細については、『AWS SDK for Java API Reference』の「reEncrypt メソッド」を参照してください。

// Re-encrypt a data key ByteBuffer sourceCiphertextBlob = Place your ciphertext here; // Replace the fictitious keyID value with a valid key ID, key ARN, or alias of an AWS CMK. String destinationKeyId = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; ReEncryptRequest req = new ReEncryptRequest(); req.setCiphertextBlob(sourceCiphertextBlob); req.setDestinationKeyId(destinationKeyId); ByteBuffer destinationCipherTextBlob = kmsClient.reEncrypt(req).getCiphertextBlob();
C#

詳細については、AWS SDK for .NET の「ReEncrypt メソッド」を参照してください。

// Re-encrypt a data key MemoryStream sourceCiphertextBlob = new MemoryStream(); // Write ciphertext to memory stream // Replace the fictitious keyID value with a valid key ID, key ARN, or alias of an AWS CMK. String destinationKeyId = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; ReEncryptRequest reEncryptRequest = new ReEncryptRequest() { CiphertextBlob = sourceCiphertextBlob, DestinationKeyId = destinationKeyId }; MemoryStream destinationCipherTextBlob = kmsClient.ReEncrypt(reEncryptRequest).CiphertextBlob;