翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
非対称キーの仕様
以下のトピックは、非対称 KMS キーについて AWS KMS がサポートするキー仕様に関する技術的な情報を提供します。比較できるように、対称暗号化キーの SYMMETRIC_DEFAULT キー仕様に関する情報が含まれています。
RSA キー仕様
RSA キー仕様を使用する際、AWS KMS は RSA キーペアを持つ非対称 KMS キーを作成します。プライベートキーが暗号化されないまま AWS KMS から出ていくことはありません。AWS KMS 内でパブリックキーを使用することも、AWS KMS の外部で使用するためにパブリックキーをダウンロードすることもできます。
警告
AWS KMS の外部でデータを暗号化する場合は、暗号文を復号できることを確認してください。AWS KMS から削除された KMS キーのパブリックキー、署名と検証用に設定された KMS キーのパブリックキー、または KMS キーでサポートされていない暗号化アルゴリズムを使用する場合、データは回復できません。
AWS KMS では、非対称 KMS キーを RSA キーペアとともに暗号化と復号、または署名と検証に使用できますが、両方には使用できません。このプロパティは、キーの用途と呼ばれ、キー仕様とは別に決定されますが、キー仕様を選択する前に決定する必要があります。
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
オペレーションを呼び出す場合、AWS KMS は RSA キーペアのパブリックキーと、指定された暗号化アルゴリズムを使用してデータを暗号化します。暗号テキストを復号するには、Decrypt
オペレーションを呼び出し、同じ KMS キーと暗号化アルゴリズムを指定します。AWS KMS は次に、RSA キーペアのプライベートキーを使用してデータを復号します。
パブリックキーをダウンロードして、AWS KMS の外部のデータを暗号化するために使用することもできます。必ず、AWS KMS が RSA KMS キーでサポートする暗号化アルゴリズムを使用してください。暗号テキストを復号するには、同じ KMS キーと暗号化アルゴリズムを使用して Decrypt
関数を呼び出します。
AWS KMS は、RSA キー仕様を持つ KMS キーの 2 つの暗号化アルゴリズムをサポートします。PKCS #1 v2.2
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コンソールまたは GetPublicKeyオペレーションを使用してパブリックキーをダウンロードするときに、キー仕様と暗号化アルゴリズムAWS KMSも提供します。
各リクエストで暗号化できるプレーンテキストデータの長さに基づいて、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
オペレーションを呼び出すと、AWS KMS は RSA キーペアのプライベートキー、メッセージ、指定した署名アルゴリズムを使用して、署名を生成します。署名を検証するには、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コンソールまたは GetPublicKeyオペレーションを使用してパブリックキーをダウンロードするときに、キー仕様と署名アルゴリズムAWS KMSも提供します。
楕円曲線のキー仕様
楕円曲線 (ECC) キー仕様を使用すると、AWS KMS は署名と検証のために ECC キーペアを持つ非対称 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 キーを作成する場合は、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 署名。 |
SM2 キー仕様 (中国リージョンのみ)
SM2 キー仕様は、中国国家商業暗号局 (OSCCA)
ECC キースペックとは異なり、署名と検証または暗号化と復号に SM2 KMS キーを使用できます。KMS キーの作成時にキーの用途を指定する必要があります。キーの作成後に変更することはできません。
AWS KMS は、以下の SM2 暗号化および署名アルゴリズムをサポートしています。
- SM2PKE 暗号化アルゴリズム
SM2PKE は、GM/T 0003.4-2012 で OSCCA によって定義された楕円曲線ベースの暗号化アルゴリズムです。
- SM2DSA 署名アルゴリズム
SM2DSA は、GM/T 0003.2-2012 で OSCCA によって定義された楕円曲線ベースの暗号化アルゴリズムです。SM2DSA には、SM3 ハッシュアルゴリズムでハッシュ化され、AWS KMS に渡されたメッセージまたはメッセージダイジェストと組み合わされた識別 ID が必要です。この連結された値は、AWS KMS によりハッシュ化されて署名されます。
SM2 によるオフライン運用 (中国リージョンのみ)
オフラインオペレーションで SM2 キーペアのパブリックキーをダウンロードし、AWS KMS の外部でのオペレーションを行えます。ただし、SM2 パブリックキーをオフラインで使用する場合、追加の変換と計算を手動で実行する必要がある場合があります。SM2DSA 操作では、識別 ID の提供またはメッセージダイジェストの計算が必要になる場合があります。SM2PKE 暗号化オペレーションでは、生の暗号文出力を AWS KMS が受け入れるフォーマットに変換する必要のある場合があります。
これらの操作を支援するために、Java の SM2OfflineOperationHelper
クラスには、タスクを実行するメソッドがあります。このヘルパークラスは、他の暗号化プロバイダのモデルとして使用できます。
重要
SM2OfflineOperationHelper
リファレンスコードは Bouncy Castle
SM2 キーペアによるオフライン検証 (中国リージョンのみ)
SM2 パブリックキーを使用して AWS KMS の外部で署名を検証するには、識別 ID を指定する必要があります。生のメッセージ MessageType:RAW
を Sign API に渡すとき、AWS KMS は GM/T 0009-2012 で OSCCA によって定義されているデフォルトの識別 ID 1234567812345678
を使用します。独自の識別 ID を AWS KMS で指定することはできません。
ただし、AWS メッセージダイジェストを外部で生成する場合、独自の識別 ID を指定して、メッセージダイジェスト MessageType:DIGEST
を AWS KMS に渡し、署名することができます。これを行うには、SM2OfflineOperationHelper
クラスの DEFAULT_DISTINGUISHING_ID
値を変更します。指定する識別 ID は、最大 8,192 文字の任意の文字列です。AWS KMS がメッセージダイジェストに署名した後、メッセージダイジェストまたはメッセージと、ダイジェストを計算してオフラインで検証するために使用される識別 ID のいずれかが必要です。
SM2OfflineOperationHelper
クラス
AWS KMS 内では、生の暗号文変換と SM2DSA メッセージダイジェストの計算が自動的に行われます。どの暗号化プロバイダーも同じ方法で SM2 を実装しているとは限りません。OpenSSLSM2OfflineOperationHelper
クラスを使用します。
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] (対称)、キーの用途に [Encrypt and decrypt] (暗号化および復号) を選択すると、SYMMETRIC_DEFAULT
キー仕様が選択されます。CreateKey オペレーションでは、KeySpec
値を指定しない場合、SYMMETRIC_DEFAULT が選択されます。別のキー仕様を使用する理由がない場合は、SYMMETRIC_DEFAULT を選択することをお勧めします。
SYMMETRIC_DEFAULT は現在、AES-256-GCM を表しています。Galois Counter Mode
AES-256-GCM で暗号化されたデータは、現在も将来も保護されています。暗号作成者は、このアルゴリズムには量子耐性があると考えています。理論上の将来、256 ビット AES-GCM キーで作成された暗号文に対する大規模な量子コンピューティング攻撃は、キーの効果的なセキュリティを 128 ビットに低下させます
中国リージョンでは唯一の例外で、SYMMETRIC_DEFAULT は SM4 暗号化を使用する 128 ビットの対称キーを表します。128 ビット SM4 キーは、中国リージョンでのみ作成できます。中国リージョンでは、256 ビット AES-GCM KMS キーを作成することはできません。
AWS KMS で対称暗号化 KMS キーを使用して、データの暗号化、復号、再暗号化、および生成されたデータキーとデータキーペアの保護を行うことができます。AWS KMS と統合された AWS のサービスは、対称暗号化 KMS キーを使用して保管中のデータを暗号化します。対称暗号化 KMS キーに独自のキーマテリアルをインポートし、カスタムキーストアで対称暗号化 KMS キーを作成することができます。対称および非対称 KMS キーで実行できるオペレーションを比較した表については、「対称および非対称 KMS キーの比較」を参照してください。
AWS KMS と対称暗号化キーの技術的詳細については、「AWS Key Management Service の暗号化の詳細説明」を参照してください。