非対称キーの仕様 - AWS Key Management Service

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

非対称キーの仕様

以下のトピックは、非対称 KMS キーについて AWS KMS がサポートするキー仕様に関する技術的な情報を提供します。比較できるように、対称暗号化キーの SYMMETRIC_DEFAULT キー仕様に関する情報が含まれています。

RSA キー仕様

RSA キー仕様を使用すると、 は RSA キーペアを使用して非対称 KMS キー AWS KMS を作成します。プライベートキーが暗号化 AWS KMS されていないままになることはありません。内でパブリックキーを使用するか AWS KMS、パブリックキーをダウンロードして の外部で使用できます AWS KMS。

警告

の外部でデータを暗号化する場合は AWS KMS、暗号文を復号できることを確認してください。 AWS KMSから削除された KMS キーのパブリックキー、署名と検証用に設定された KMS キーのパブリックキー、または KMS キーでサポートされていない暗号化アルゴリズムを使用する場合、データは回復できません。

では AWS KMS、RSA キーペアを持つ非対称 KMS キーを暗号化と復号、または署名と検証に使用できますが、両方を使用することはできません。このプロパティは、キーの用途と呼ばれ、キー仕様とは別に決定されますが、キー仕様を選択する前に決定する必要があります。

AWS KMS は、暗号化と復号、または署名と検証について、次の RSA キー仕様をサポートしています。

  • RSA_2048

  • RSA_3072

  • RSA_4096

RSA キー仕様は、RSA キーの長さ(ビット単位)によって異なります。選択する RSA キー仕様は、セキュリティ標準またはタスクの要件によって決定される場合があります。一般的に、タスクに実用的で手頃な価格の、最大のキーを使用します。RSA キー仕様の異なる KMS キーの暗号化オペレーションは、料金が異なります。 AWS KMS 料金の詳細については、AWS 「 Key Management Service の料金」を参照してください。リクエストクォータの詳細については、「クォータのリクエスト」を参照してください。

暗号化および復号の RSA キー仕様

RSA 非対称 KMS キーを暗号化および復号に使用する場合、パブリックキーで暗号化し、プライベートキーで復号します。RSA KMS キー AWS KMS の で Encryptオペレーションを呼び出すと、 は RSA キーペアのパブリックキーと、指定した暗号化アルゴリズム AWS KMS を使用してデータを暗号化します。暗号文を復号するには、 Decryptオペレーションを呼び出し、同じ KMS キーと暗号化アルゴリズムを指定します。 AWS KMS その後、 は RSA キーペアのプライベートキーを使用してデータを復号します。

パブリックキーをダウンロードして、 の外部でデータを暗号化するためにも使用できます AWS KMS。RSA KMS キーで が AWS KMS サポートする暗号化アルゴリズムを使用してください。暗号テキストを復号するには、同じ KMS キーと暗号化アルゴリズムを使用して Decrypt 関数を呼び出します。

AWS KMS は、RSA キー仕様の KMS キーに対して 2 つの暗号化アルゴリズムをサポートします。PKCS #1 v2.2 で定義されるこれらのアルゴリズムは、内部的に使用するハッシュ関数によって異なります。 AWS KMSで、RSAES_OAEP アルゴリズムは、ハッシュ目的とマスク生成関数 (MGF1) の両方に常に同じハッシュ関数を使用します。Encrypt および Decrypt オペレーションを呼び出すときは、暗号化アルゴリズムを指定する必要があります。リクエストごとに異なるアルゴリズムを選択できます。

RSA キー仕様にサポートされる暗号化アルゴリズム
暗号化アルゴリズム アルゴリズムの説明
RSAES_OAEP_SHA_1 PKCS #1 v2.2、セクション 7.1。ハッシュと MGF1 マスク生成機能の両方に空のラベルとともに SHA-1 を使用した OAEP パディングによるRSA暗号化。
RSAES_OAEP_SHA_256 PKCS #1、セクション 7.1. ハッシュと MGF1 マスク生成機能の両方に空のラベルとともに SHA-256 を使用した OAEP パディングによるRSA暗号化。

特定の暗号化アルゴリズムを使用するように KMS キーを設定することはできません。ただし、kms:EncryptionAlgorithm policy 条件を使用して、プリンシパルが KMS キーで使用できる暗号化アルゴリズムを指定できます。

KMS キーの暗号化アルゴリズムを取得するには、 AWS KMS コンソールで KMS キーの暗号化設定を表示するか、 DescribeKeyオペレーションを使用します。 AWS KMS は、 AWS KMS コンソールまたは GetPublicKeyオペレーションを使用してパブリックキーをダウンロードするときに、キー仕様と暗号化アルゴリズムも提供します。

各リクエストで暗号化できるプレーンテキストデータの長さに基づいて、RSA キー仕様を選択できます。次の表に、Encrypt オペレーションに対する 1 回の呼び出しで暗号化できるプレーンテキストの最大サイズをバイト単位で示します。値は、キー仕様と暗号化アルゴリズムによって異なります。比較すると、対称暗号化 KMS キーは一度に最大 4,096 バイトを暗号化するために使用できます。

これらのアルゴリズムのプレーンテキストの最大長(バイト単位)を計算するには、次の式を使用します。(key_size_in_bits / 8) - (2 * hash_length_in_bits/8) - 2。例えば、RSA_2048 と SHA-256 の場合、バイト単位のプレーンテキストの最大サイズは、(2048/8) - (2 * 256/8) -2 = 190 です。

暗号化オペレーションの最大プレーンテキストサイズ(バイト単位)
暗号化アルゴリズム
キー仕様 RSAES_OAEP_SHA_1 RSAES_OAEP_SHA_256
RSA_2048 214 190
RSA_3072 342 318
RSA_4096 470 446

署名および検証用の RSA キー仕様

署名と検証に RSA 非対称 KMS キーを使用する場合、プライベートキーを持つメッセージの署名を生成し、パブリックキーで署名を検証します。

非対称 KMS キー AWS KMS の で Signオペレーションを呼び出すと、 は RSA キーペアのプライベートキー、メッセージ、および指定した署名アルゴリズム AWS KMS を使用して署名を生成します。署名を検証するには、Verify オペレーションを呼び出します。署名に加えて、同じ KMS キー、メッセージ、署名アルゴリズムを指定します。 AWS KMS その後、 は RSA キーペアのパブリックキーを使用して署名を検証します。パブリックキーをダウンロードし、それを使用して の外部で署名を検証することもできます AWS KMS。

AWS KMS は、RSA キー仕様のすべての KMS キーに対して次の署名アルゴリズムをサポートします。Sign オペレーションと Verify オペレーションを呼び出すときは、署名アルゴリズムを指定する必要があります。リクエストごとに異なるアルゴリズムを選択できます。RSA キーペアで署名する場合は、RSASSA-PSS アルゴリズムが推奨されます。既存のアプリケーションとの互換性を保つため、RSASSA-PKCS1-v1_5 アルゴリズムが採用されています。

RSA キー仕様でサポートされる署名アルゴリズム
署名アルゴリズム アルゴリズムの説明
RSASSA_PSS_SHA_256 PKCS #1 v2.2、セクション 8.1、メッセージダイジェストと MGF1 マスク生成機能の両方に SHA-256 とともに 256 ビットソルトを使用する PSS パディング付きの RSA 署名
RSASSA_PSS_SHA_384 PKCS #1 v2.2、セクション 8.1、メッセージダイジェストと MGF1 マスク生成機能の両方に SHA-384 とともに 384 ビットソルトを使用する PSS パディング付きの RSA 署名
RSASSA_PSS_SHA_512 PKCS #1 v2.2、セクション 8.1、メッセージダイジェストと MGF1 マスク生成機能の両方に SHA-512 とともに 512 ビットソルトを使用する PSS パディング付きの RSA 署名
RSASSA_PKCS1_V1_5_SHA_256 PKCS #1 v2.2、セクション 8.2、PKCS #1v1.5 パディングおよび SHA-256 を使用した RSA 署名
RSASSA_PKCS1_V1_5_SHA_384 PKCS #1 v2.2、セクション 8.2、PKCS #1v1.5 パディングおよび SHA-384 を使用した RSA 署名
RSASSA_PKCS1_V1_5_SHA_512 PKCS #1 v2.2、セクション 8.2、PKCS #1v1.5 パディングおよび SHA-512 を使用した RSA 署名

特定の署名アルゴリズムを使用するように KMS キーを設定することはできません。ただし、kms:SigningAlgorithm policy 条件を使用して、プリンシパルが KMS キーで使用できる署名アルゴリズムを指定できます。

KMS キーの署名アルゴリズムを取得するには、 AWS KMS コンソールで、または DescribeKeyオペレーションを使用して KMS キーの暗号化設定を表示します。 AWS KMS は、 AWS KMS コンソールまたは GetPublicKeyオペレーションを使用してパブリックキーをダウンロードするときに、キー仕様と署名アルゴリズムも提供します。

楕円曲線のキー仕様

楕円曲線 (ECC) キー仕様を使用すると、 は署名と検証、または共有シークレットの取得 (両方ではない) のために ECC キーペアを持つ非対称 KMS キー AWS KMS を作成します。署名を生成したり、共有シークレットを派生させたりするプライベートキーは、暗号化 AWS KMS されずに を残しません。パブリックキーを使用して 内の署名を検証するか AWS KMS、パブリックキーをダウンロードして の外部で使用できます AWS KMS。

AWS KMS は、非対称 KMS キーの次の ECC キー仕様をサポートします。

  • 非対称 NIST が推奨する楕円曲線キーペア (共有シークレットの署名と検証)

    • ECC_NIST_P256 (secp256r1)

    • ECC_NIST_P384 (secp384r1)

    • ECC_NIST_P521 (secp521r1)

  • その他の非対称楕円曲線キーペア (署名と検証)

    • ECC_SECG_P256K1 (secp256k1)。一般に暗号通貨に用いられる。

選択する ECC キー仕様は、セキュリティ標準またはタスクの要件によって決定される場合があります。一般的に、タスクに実用的で手頃な価格の、最も多くのポイントがある曲線を使用します。

非対称 KMS キーを作成して共有シークレット を取得する場合は、NIST が推奨する楕円曲線キー仕様のいずれかを使用します。共有シークレットを取得するためにサポートされている唯一のキーアグリーメントアルゴリズムは、楕円曲線暗号補数 Diffie-Hellman Primitive (ECDH) です。

暗号通貨で使用する非対称 KMS キーを作成する場合は、ECC_SECG_P256K1 キー仕様を使用します。このキー仕様を他の目的に使用することもできますが、Bitcoin やその他の暗号化通貨には必要です。

ECC キー仕様が異なる KMS キー仕様は料金が異なるため、リクエストクォータも異なる場合があります。 AWS KMS 料金の詳細については、「 の料金AWS Key Management Service」を参照してください。リクエストクォータの詳細については、「クォータのリクエスト」を参照してください 。

次の表は、ECC キー仕様ごとに が AWS KMS サポートする署名アルゴリズムを示しています。特定の署名アルゴリズムを使用するように KMS キーを設定することはできません。ただし、kms:SigningAlgorithm policy 条件を使用して、プリンシパルが KMS キーで使用できる署名アルゴリズムを指定できます。

ECC キー仕様でサポートされる署名アルゴリズム
キー仕様 署名アルゴリズム アルゴリズムの説明
ECC_NIST_P256 ECDSA_SHA_256 メッセージダイジェストのためにキーおよび SHA-256 で指定された曲線を使用する、NIST FIPS 186-4、セクション 6.4、ECDSA 署名。
ECC_NIST_P384 ECDSA_SHA_384 メッセージダイジェストのためにキーおよび SHA-384 で指定された曲線を使用する、NIST FIPS 186-4、セクション 6.4、ECDSA 署名。
ECC_NIST_P521 ECDSA_SHA_512 メッセージダイジェストのためにキーおよび SHA-512 で指定された曲線を使用する、NIST FIPS 186-4、セクション 6.4、ECDSA 署名。
ECC_SECG_P256K1 ECDSA_SHA_256 メッセージダイジェストのためにキーおよび SHA-256 で指定された曲線を使用する、NIST FIPS 186-4、セクション 6.4、ECDSA 署名。

オフラインでの共有シークレットの取得

ECC キーペアのパブリックキーをダウンロードして、オフラインオペレーション、つまり の外部オペレーションで使用できます AWS KMS。

次の OpenSSL チュートリアルでは、ECC KMS キーペアのパブリックキーと OpenSSL で作成されたプライベートキー AWS KMS を使用して、 外で共有シークレットを取得する方法の 1 つを示します。 OpenSSL

  1. OpenSSL で ECC キーペアを作成し、 で使用する準備をします AWS KMS。

    // Create an ECC key pair in OpenSSL and save the private key in openssl_ecc_key_priv.pem export OPENSSL_CURVE_NAME="P-256" export KMS_CURVE_NAME="ECC_NIST_P256" export OPENSSL_KEY1_PRIV_PEM="openssl_ecc_key1_priv.pem" openssl ecparam -name ${OPENSSL_CURVE_NAME} -genkey -out ${OPENSSL_KEY1_PRIV_PEM} // Derive the public key from the private key export OPENSSL_KEY1_PUB_PEM="openssl_ecc_key1_pub.pem" openssl ec -in ${OPENSSL_KEY1_PRIV_PEM} -pubout -outform pem \ -out ${OPENSSL_KEY1_PUB_PEM} // View the PEM file containing the public key and extract the public key as a // Base64 encoded string into OPENSSL_KEY1_PUB_BASE64 for use with AWS KMS export OPENSSL_KEY1_PUB_BASE64=`cat ${OPENSSL_KEY1_PUB_PEM} | \ tee /dev/stderr | grep -v "PUBLIC KEY" | tr -d "\n"`
  2. で ECC キーアグリーメントキーペアを作成し AWS KMS 、OpenSSL で使用する準備をします。

    // Create a KMS key on the same curve as the key pair from step 1 // with a key usage of KEY_AGREEMENT // Save its ARN in KMS_KEY1_ARN. export KMS_KEY1_ARN=`aws kms create-key --key-spec ${KMS_CURVE_NAME} \ --key-usage KEY_AGREEMENT | tee /dev/stderr | jq -r .KeyMetadata.Arn` // Download the public key and save the Base64-encoded version in KMS_KEY1_PUB_BASE64 export KMS_KEY1_PUB_BASE64=`aws kms get-public-key --key-id ${KMS_KEY1_ARN} | \ tee /dev/stderr | jq -r .PublicKey` // Create a PEM file for the public KMS key for use with OpenSSL export KMS_KEY1_PUB_PEM="aws_kms_ecdh_key1_pub.pem" echo "-----BEGIN PUBLIC KEY-----" > ${KMS_KEY1_PUB_PEM} echo ${KMS_KEY1_PUB_BASE64} | fold -w 64 >> ${KMS_KEY1_PUB_PEM} echo "-----END PUBLIC KEY-----" >> ${KMS_KEY1_PUB_PEM}
  3. OpenSSL のプライベートキーとパブリック KMS キーを使用して、OpenSSL で共有シークレットを取得します。

    export OPENSSL_SHARED_SECRET1_BIN="openssl_shared_secret1.bin" openssl pkeyutl -derive -inkey ${OPENSSL_KEY1_PRIV_PEM} \ -peerkey ${KMS_KEY1_PUB_PEM} -out ${OPENSSL_SHARED_SECRET1_BIN}

SM2 キー仕様 (中国リージョンのみ)

SM2 キー仕様は、中国国家商業暗号局 (OSCCA) によって公開されている GM/T シリーズの仕様で定義されている楕円曲線のキー仕様です。SM2 キー仕様は、中国リージョンでのみ利用可能です。SM2 キー仕様を使用すると、 は SM2 キーペアを使用して非対称 KMS キー AWS KMS を作成します。内で SM2 キーペアを使用するか AWS KMS、パブリックキーをダウンロードして の外部で使用できます AWS KMS。

各 KMS キーに指定できるキー用途は 1 つだけです。SM2 KMS キーは、署名と検証、暗号化と復号、共有シークレットの取得に使用できます。KMS キーの作成時にキーの用途を指定する必要があります。キーの作成後に変更することはできません。

非対称 KMS キーを作成して共有シークレット を取得する場合は、SM2 キー仕様を使用します。共有シークレットを取得するためにサポートされているキーアグリーメントアルゴリズムは、楕円曲線暗号コファクタリング Diffie-Hellman Primitive (ECDH) のみです。

AWS KMS は、次の SM2 暗号化および署名アルゴリズムをサポートしています。

  • SM2PKE 暗号化アルゴリズム

    SM2PKE は、GM/T 0003.4-2012 で OSCCA によって定義された楕円曲線ベースの暗号化アルゴリズムです。

  • SM2DSA 署名アルゴリズム

    SM2DSA は、GM/T 0003.2-2012 で OSCCA によって定義された楕円曲線ベースの暗号化アルゴリズムです。SM2DSA には、SM3 ハッシュアルゴリズムでハッシュされた識別 ID が必要です。その後、 に渡されたメッセージまたはメッセージダイジェストと結合されます AWS KMS。その後、この連結された値はハッシュ化され、 によって署名されます AWS KMS。

SM2 によるオフライン運用 (中国リージョンのみ)

オフラインオペレーションで SM2 キーペアのパブリックキーをダウンロードし、 AWS KMSの外部でのオペレーションを行えます。ただし、SM2 パブリックキーをオフラインで使用する場合、追加の変換と計算を手動で実行する必要がある場合があります。SM2DSA 操作では、識別 ID の提供またはメッセージダイジェストの計算が必要になる場合があります。SM2PKE 暗号化オペレーションでは、raw 暗号文出力を が受け入れ AWS KMS ることができる形式に変換する必要がある場合があります。

これらの操作を支援するために、Java の SM2OfflineOperationHelper クラスには、タスクを実行するメソッドがあります。このヘルパークラスは、他の暗号化プロバイダのモデルとして使用できます。

重要

SM2OfflineOperationHelper リファレンスコードは Bouncy Castle バージョン 1.68 と互換性があるように設計されています。他のバージョンに関するヘルプについては、bouncycastle.org にアクセスしてください。

SM2 キーペアによるオフライン検証 (中国リージョンのみ)

SM2 パブリックキー AWS KMS を使用して の外部で署名を検証するには、識別 ID を指定する必要があります。raw メッセージ を Sign API MessageType:RAWに渡すと、 AWS KMS は GM/T 0009-2012 の OSCCA で1234567812345678定義されたデフォルトの識別 ID を使用します。独自の識別 ID を AWS KMSで指定することはできません。

ただし、 の外部でメッセージダイジェストを生成する場合は AWS、独自の識別 ID を指定し、メッセージダイジェスト を MessageType:DIGESTに渡 AWS KMS して署名できます。これを行うには、SM2OfflineOperationHelper クラスの DEFAULT_DISTINGUISHING_ID 値を変更します。指定する識別 ID は、最大 8,192 文字の任意の文字列です。がメッセージダイジェスト AWS KMS に署名したら、メッセージダイジェストまたはメッセージのいずれかと、ダイジェストの計算に使用された識別 ID を使用してオフラインで検証する必要があります。

SM2OfflineOperationHelper クラス

内では AWS KMS、raw 暗号文変換と SM2DSA メッセージダイジェスト計算が自動的に行われます。どの暗号化プロバイダーも同じ方法で SM2 を実装しているとは限りません。OpenSSL1.1.1 以降などの一部のライブラリは、OpenSSL バージョン 3.0 OpenSSL でのテストでこれらのアクションを自動的に実行 AWS KMS します。変換と計算を手動で実行するには、Bouncy Castle などのライブラリを持つ以下の SM2OfflineOperationHelper クラスを使用します。

SM2OfflineOperationHelper クラスは、次のオフラインオペレーションのためのメソッドを提供します。

  • メッセージダイジェストの計算

    オフライン検証に使用できる、または に渡して署名できるメッセージダイジェストをオフライン AWS KMS で生成するには、 calculateSM2Digestメソッドを使用します。calculateSM2Digest メソッドは SM3 ハッシュアルゴリズムでメッセージダイジェストを生成します。GetPublicKey API は、パブリックキーをバイナリ形式で返します。バイナリキーを Java に解析する必要があります PublicKey。解析されたパブリックキーをメッセージとともに提供します。このメソッドは、メッセージをデフォルトの識別 ID、1234567812345678 と自動的に組み合わせますが、DEFAULT_DISTINGUISHING_ID 値を変更して、独自の識別 ID を設定することもできます。

  • 検証

    署名をオフラインで検証するには、offlineSM2DSAVerify メソッドを使用します。offlineSM2DSAVerify メソッドは、指定された識別 ID から計算されたメッセージダイジェストと、指定された元のメッセージを使用してデジタル署名を検証します。GetPublicKey API は、パブリックキーをバイナリ形式で返します。バイナリキーを Java に解析する必要があります PublicKey。解析されたパブリックキーに、元のメッセージと検証する署名を指定します。詳細については、「SM2 キーペアによるオフライン検証」を参照してください。

  • 暗号化

    プレーンテキストをオフラインで暗号化するには、offlineSM2PKEEncrypt メソッドを使用します。この方法では、暗号文が復 AWS KMS 号できる形式になります。offlineSM2PKEEncrypt メソッドは、プレーンテキストを暗号化し、生成された生の暗号文を SM2PKE によって ASN.1 形式に変換します。GetPublicKey API は、パブリックキーをバイナリ形式で返します。バイナリキーを Java に解析する必要があります PublicKey。解析したパブリックキーに、暗号化するプレーンテキストを指定します。

    変換を実行する必要があるかどうかわからない場合は、次の OpenSSL オペレーション使用して暗号文の形式をテストします。オペレーションが失敗した場合は、暗号文を ASN.1 形式に変換する必要があります。

    openssl asn1parse -inform DER -in ciphertext.der

デフォルトでは、SM2DSA オペレーションのメッセージダイジェストを生成するとき、SM2OfflineOperationHelper クラスはデフォルトの識別 ID、1234567812345678 を使用します。

package com.amazon.kms.utils; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.jce.interfaces.ECPublicKey; import java.util.Arrays; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.DEROctetString; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.gm.GMNamedCurves; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.params.ParametersWithID; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.signers.SM2Signer; import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil; public class SM2OfflineOperationHelper { // You can change the DEFAULT_DISTINGUISHING_ID value to set your own distinguishing ID, // the DEFAULT_DISTINGUISHING_ID can be any string up to 8,192 characters long. private static final byte[] DEFAULT_DISTINGUISHING_ID = "1234567812345678".getBytes(StandardCharsets.UTF_8); private static final X9ECParameters SM2_X9EC_PARAMETERS = GMNamedCurves.getByName("sm2p256v1"); // ***calculateSM2Digest*** // Calculate message digest public static byte[] calculateSM2Digest(final PublicKey publicKey, final byte[] message) throws NoSuchProviderException, NoSuchAlgorithmException { final ECPublicKey ecPublicKey = (ECPublicKey) publicKey; // Generate SM3 hash of default distinguishing ID, 1234567812345678 final int entlenA = DEFAULT_DISTINGUISHING_ID.length * 8; final byte [] entla = new byte[] { (byte) (entlenA & 0xFF00), (byte) (entlenA & 0x00FF) }; final byte [] a = SM2_X9EC_PARAMETERS.getCurve().getA().getEncoded(); final byte [] b = SM2_X9EC_PARAMETERS.getCurve().getB().getEncoded(); final byte [] xg = SM2_X9EC_PARAMETERS.getG().getXCoord().getEncoded(); final byte [] yg = SM2_X9EC_PARAMETERS.getG().getYCoord().getEncoded(); final byte[] xa = ecPublicKey.getQ().getXCoord().getEncoded(); final byte[] ya = ecPublicKey.getQ().getYCoord().getEncoded(); final byte[] za = MessageDigest.getInstance("SM3", "BC") .digest(ByteBuffer.allocate(entla.length + DEFAULT_DISTINGUISHING_ID.length + a.length + b.length + xg.length + yg.length + xa.length + ya.length).put(entla).put(DEFAULT_DISTINGUISHING_ID).put(a).put(b).put(xg).put(yg).put(xa).put(ya) .array()); // Combine hashed distinguishing ID with original message to generate final digest return MessageDigest.getInstance("SM3", "BC") .digest(ByteBuffer.allocate(za.length + message.length).put(za).put(message) .array()); } // ***offlineSM2DSAVerify*** // Verify digital signature with SM2 public key public static boolean offlineSM2DSAVerify(final PublicKey publicKey, final byte [] message, final byte [] signature) throws InvalidKeyException { final SM2Signer signer = new SM2Signer(); CipherParameters cipherParameters = ECUtil.generatePublicKeyParameter(publicKey); cipherParameters = new ParametersWithID(cipherParameters, DEFAULT_DISTINGUISHING_ID); signer.init(false, cipherParameters); signer.update(message, 0, message.length); return signer.verifySignature(signature); } // ***offlineSM2PKEEncrypt*** // Encrypt data with SM2 public key public static byte[] offlineSM2PKEEncrypt(final PublicKey publicKey, final byte [] plaintext) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, IOException { final Cipher sm2Cipher = Cipher.getInstance("SM2", "BC"); sm2Cipher.init(Cipher.ENCRYPT_MODE, publicKey); // By default, Bouncy Castle returns raw ciphertext in the c1c2c3 format final byte [] cipherText = sm2Cipher.doFinal(plaintext); // Convert the raw ciphertext to the ASN.1 format before passing it to AWS KMS final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector(); final int coordinateLength = (SM2_X9EC_PARAMETERS.getCurve().getFieldSize() + 7) / 8 * 2 + 1; final int sm3HashLength = 32; final int xCoordinateInCipherText = 33; final int yCoordinateInCipherText = 65; byte[] coords = new byte[coordinateLength]; byte[] sm3Hash = new byte[sm3HashLength]; byte[] remainingCipherText = new byte[cipherText.length - coordinateLength - sm3HashLength]; // Split components out of the ciphertext System.arraycopy(cipherText, 0, coords, 0, coordinateLength); System.arraycopy(cipherText, cipherText.length - sm3HashLength, sm3Hash, 0, sm3HashLength); System.arraycopy(cipherText, coordinateLength, remainingCipherText, 0,cipherText.length - coordinateLength - sm3HashLength); // Build standard SM2PKE ASN.1 ciphertext vector asn1EncodableVector.add(new ASN1Integer(new BigInteger(1, Arrays.copyOfRange(coords, 1, xCoordinateInCipherText)))); asn1EncodableVector.add(new ASN1Integer(new BigInteger(1, Arrays.copyOfRange(coords, xCoordinateInCipherText, yCoordinateInCipherText)))); asn1EncodableVector.add(new DEROctetString(sm3Hash)); asn1EncodableVector.add(new DEROctetString(remainingCipherText)); return new DERSequence(asn1EncodableVector).getEncoded("DER"); } }

SYMMETRIC_DEFAULT キー仕様

デフォルトのキー仕様である SYMMETRIC_DEFAULT は、対称暗号化 KMS キーのキー仕様です。 AWS KMS コンソールで対称キータイプと暗号化キーと復号キーの使用法を選択すると、SYMMETRIC_DEFAULTキー仕様が選択されます。CreateKey オペレーションでKeySpec値を指定しない場合、SYMMETRIC_DEFAULT が選択されます。別のキー仕様を使用する理由がない場合は、SYMMETRIC_DEFAULT を選択することをお勧めします。

SYMMETRIC_DEFAULT は現在、AES-256-GCM を表しています。Galois Counter Mode (GCM) のアドバンスト暗号化スタンダード (AES) に基づく対称アルゴリズムは、安全な暗号化のための業界標準である 256 ビットキーを備えています。このアルゴリズムが生成する暗号文は、暗号化コンテキストなどの追加認証データ (AAD) をサポートし、GCM は暗号文での追加の整合性チェックを提供します。技術的な詳細については、「AWS Key Management Service 暗号化の詳細」を参照してください。

AES-256-GCM で暗号化されたデータは、現在も将来も保護されています。暗号作成者は、このアルゴリズムには量子耐性があると考えています。理論上の将来、256 ビット AES-GCM キーで作成された暗号文に対する大規模な量子コンピューティング攻撃は、キーの効果的なセキュリティを 128 ビットに低下させます。ただし、このセキュリティレベルは、 AWS KMS 暗号文に対するブルートフォース攻撃を実行不可能にするのに十分です。

中国リージョンでは唯一の例外で、SYMMETRIC_DEFAULT は SM4 暗号化を使用する 128 ビットの対称キーを表します。128 ビット SM4 キーは、中国リージョンでのみ作成できます。中国リージョンでは、256 ビット AES-GCM KMS キーを作成することはできません。

で対称暗号化 KMS キーを使用して、データを AWS KMS 暗号化、復号、再暗号化し、生成されたデータキーと と統合されたデータキーペアを保護できます。 AWS サービスは、対称暗号化 KMS キー AWS KMS を使用して保管中のデータを暗号化します。対称暗号化 KMS キーに独自のキーマテリアルをインポートし、カスタムキーストアで対称暗号化 KMS キーを作成することができます。対称および非対称 KMS キーで実行できるオペレーションを比較した表については、「対称および非対称 KMS キーの比較」を参照してください。

AWS KMS および対称暗号化キーの技術的な詳細については、AWS Key Management Service 「暗号化の詳細」を参照してください。