2

対称キー(AES)をAESキーでラップするコードがあります:

  1. swkKey : ラッピングに使用される AES キーです。
  2. key : ラップされるキー。

コード:

SecretKey swkKeySpec = new SecretKeySpec(swkKey, 0, swkKey.length, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
final int ivLength = 12;
final IvParameterSpec iv = createIV(ivLength);///Creates a new array.
cipher.init(Cipher.WRAP_MODE, swkKeySpec, iv);
SecretKey sKeySpec = new SecretKeySpec(key, 0, key.length, "AES");
byte[] wrappedAppKey = cipher.wrap(sKeySpec);`

key が 256 ビットで、swkkey が 256 ビットの場合、wrappedAppKey の長さはどれくらいになりますか。ラップされたキーは 32 バイトを超えることができますか? この場合、次のログを取得していることに注意してください。

key length: 32(key to be wrapped)
swkKey length: 32(key used to wrap)
wrappedAppKey size: 48(final wrapped key output).
4

1 に答える 1

7

標準モードの操作を使用するラップされたキーは、キーのエンコードされたデータの単純な暗号化です。AES キーのエンコードされたデータは生データと同一であるため、256 ビットのキーのデータは単純に 32 バイトです。

GCM/CBC/ECB などのこれらの特殊化されていないモードの主な違いは、キー バイトの処理方法です。キー バイトは、SecretKeyバイトとして返されるのではなく、インスタンスで直接使用されます。これは、操作がソフトウェアではなくハードウェア(スマート カード、HSM、TPM) で実行される場合に特に重要です。ラップされたキーのバイトは、特殊なデバイス内で保持/保護できます。

GCM は、その下で CTR モードを使用します。これは、ストリーム操作モードです。ストリーム モードの操作では平文のパディングは必要ないため、暗号文も単純に 32 バイトになります。Java は、認証タグ (t) も計算に含めます。デフォルトでは、GCM は認証タグの最大サイズである 16 バイトを使用するため、これが鍵自体の暗号文に追加され、48 バイトが残ります。タグのサイズは、より特殊なGCMParameterSpecクラスを使用して構成できますivParameterSpec。タグのサイズが小さいと、GCM モードの脆弱性が生じる可能性があることに注意してください。

ただし、GCM モード暗号化の IV/ノンスも再生成できる必要があることに注意してください。したがって、コンテキストから再生成できない場合は、それも保存する必要があります。同様に、ナンスが同じラッピングキーに再利用されると、GCM モードが恐ろしい方法で壊れることにも注意してください。ほとんどの場合、完全にランダムなノンスを使用するため、それを暗号文とともに保存することは非常に重要です。GCM の場合、12 バイトの nonce を使用して、暗号文を 60 バイトに拡張することを強くお勧めします。

あるいは、SIV モードまたは GCM-SIV モードを使用することもできます。これらのモードでは、認証タグを「合成」IV として使用します。これにより、暗号化が決定論的になります (同一の平文が同じ暗号文につながります)。キーはそれ自体でランダムであると想定されているため、RNG の使用や IV の保存を必要としないため、これらの種類のモードに非常に役立ちます。残念ながら、汎用暗号ライブラリには、これらのモードの実装が含まれていないことがよくあります。

于 2019-03-11T15:35:29.917 に答える