8

次の暗号を使用する Android コードを継承しました。

ks = new SecretKeySpec(key, "AES");
ciph = Cipher.getInstance("AES");

「AES」しか与えられていないので、キーサイズ、モード、およびパディングが何であるかわかりません。Bouncy Castle* のドキュメントを調べましたが、「AES」インスタンスが記述されている場所が見つかりません。可能であれば、より明示的なインスタンスの説明 (「AES/ECB/PCKS5Padding」など) を使用したいと考えています。

このインスタンスのキーサイズ、モード、パディングを知っている人はいますか?

ありがとう!

* Android は Bouncy Castle をデフォルトのプロバイダーとして使用していると読みましたが、公式のどこにもそれが見つからないため、ここでは役に立たない仮定をしている可能性があります。

4

2 に答える 2

5

"AES/ECB/PKCS5Padding"Oracleのドキュメントで指定されているように、Javaのデフォルトはデフォルトです。

モードまたはパディングが指定されていない場合、モードおよびパディングスキームのプロバイダー固有のデフォルト値が使用されます。たとえば、SunJCEプロバイダーは、デフォルトモードとしてECBを使用し、DES、DES-EDE、およびBlowfish暗号のデフォルトのパディングスキームとしてPKCS5Paddingを使用します。これは、SunJCEプロバイダーの場合は次のことを意味します。

Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding"); and
Cipher c1 = Cipher.getInstance("DES"); are equivalent statements.

OracleのドキュメントでCipherオブジェクトの作成を参照してください。


自分でデバッガを使って確認しました。少なくともAndroid4.0の場合、Androidはデフォルトで同じ暗号化およびパディングモードに設定されているようです(予想どおり)。単一の(値の)バイトのデフォルトプロバイダーを使用した結果は、16進数00の値を持つパディングされたプレーンテキストです。000F0F0F0F0F0F0F0F0F0F0F0F0F0F0Fこれは明らかにPKCS#5のパディングであり、より正確にはPKCS#7のパディングであり、 16バイトのブロック暗号のPKCS#5と同じパディングです。


原則として、どのプロバイダーもデフォルトの「SunJCE」プロバイダーとは異なるデフォルトを持つことができます。ただし、これにより、Oracle/OpenJDKのデフォルトが使用されていると想定しているアプリケーションが破損します。

同僚のプログラマーを暗闇に置くのではなく、モードとパディングを含む文字列全体を指定し、暗号化アルゴリズムのデフォルトに依存しないことSecureRandomを強くお勧めします(ただし、アルゴリズムの指定は通常推奨されません)。

于 2012-12-08T00:17:52.853 に答える
1

私が知っていることから、JavaではAESin ECBmodeを表しますwithout padding 。そして、それはアンドロイドでも同じだと思います。Androidで何かを暗号化しAES/ECB/NoPadding、JavaまたはAndroidを使用して復号化する簡単なテストを実行することをお勧めします。さらに、このアプリに IV が表示されない場合は、別のアプリです。この方向を指してください。

于 2012-12-07T21:14:56.120 に答える