デフォルトのJava暗号動作が何のためのものかを誰かが知っていますか:
SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");
具体的には、これらのクラスがIVを生成する方法と、「AES」のみを指定した場合のデフォルトの暗号化モードを理解しようとしています。ありがとう。
Oracle JDK 7(テスト済み)の場合、AESのデフォルトの暗号はAES/ECB/PKCS5Paddingです。 Javaセキュリティのドキュメントではこれについて言及していません(http://docs.Oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec)、見つけるためにいくつかのJUnitテストを行う必要があります。
これらの詳細はプロバイダー固有であり、デフォルトのモードとパディングに依存することは非常に危険です。デフォルトのプロバイダーが現在Javaで使用している値に使用している値に興味がある場合は、問題のアルゴリズムのソースコードを探し出す必要があります。たとえば、使用するデフォルト値RSAアルゴリズムの場合は ここ です。また、 Java™暗号化アーキテクチャー(JCA)リファレンスガイド には、他の質問に答えることができるかなりの情報があります。
詳細はプロバイダー固有です。 JCAリファレンスガイド は次のように述べています。
(暗号オブジェクトの作成)モードまたはパディングが指定されていない場合、モードおよびパディング方式のプロバイダー固有のデフォルト値が使用されます。たとえば、SunJCEプロバイダーは、デフォルトモードとしてECBを使用し、DES、DES-EDE、およびBlowfish暗号のデフォルトパディング方式としてPKCS5Paddingを使用します。つまり、SunJCEプロバイダーの場合、Cipher.getInstance( "DES")とCipher.getInstance( "DES/ECB/PKCS5Padding")は同等のステートメントです。
私は常に完全な形式(アルゴリズム/モード/パディング)を使用します。実装にそのような「詳細」を省くことは悪い習慣だと思うだけでなく、選択したプロバイダー(通常は1つ)に依存しない暗号文を実現するためにもストレージ/送信用に暗号化すると、同じプロバイダーが後で/もう一方の端で使用されることを確認できません)。
それはプロバイダーに依存します。プロバイダーによって、デフォルトのパラメーターが異なる場合があります。これはJava 8のリンクです。
https://docs.Oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider
Javax.crypto.Cipher.getInstance(String変換)ファクトリメソッドは、アルゴリズム/モード/パディングの形式の変換を使用して暗号を生成します。モード/パディングを省略した場合、SunJCEおよびSunPKCS11プロバイダーはECBをデフォルトのモードとして使用し、PKCS5Paddingは多くの対称暗号のデフォルトのパディングとして使用します。
デフォルトに依存するのではなく、アルゴリズム、モード、パディングを完全に指定する変換を使用することをお勧めします。
注:ECBは、単一のデータブロックに対して適切に機能し、並列化できますが、通常、複数のデータブロックに対しては使用しないでください。
したがって、AESを使用するだけでなく、モードとパディングを指定する必要があります。さらに、getInstanceメソッドはプロバイダーに別のパラメーターを持つことができますが、これはお勧めできません。
アプリケーションは、他のJava実装では利用できない場合がある特定のプロバイダーに関連付けられています