web-dev-qa-db-ja.com

Javaデフォルトの暗号/ AES動作

デフォルトのJava暗号動作が何のためのものかを誰かが知っていますか:

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");

具体的には、これらのクラスがIVを生成する方法と、「AES」のみを指定した場合のデフォルトの暗号化モードを理解しようとしています。ありがとう。

33
wuntee

Oracle JDK 7(テスト済み)の場合、AESのデフォルトの暗号はAES/ECB/PKCS5Paddingです。 Javaセキュリティのドキュメントではこれについて言及していません(http://docs.Oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec)、見つけるためにいくつかのJUnitテストを行う必要があります。

34
bratan

これらの詳細はプロバイダー固有であり、デフォルトのモードとパディングに依存することは非常に危険です。デフォルトのプロバイダーが現在Javaで使用している値に使用している値に興味がある場合は、問題のアルゴリズムのソースコードを探し出す必要があります。たとえば、使用するデフォルト値RSAアルゴリズムの場合は ここ です。また、 Java™暗号化アーキテクチャー(JCA)リファレンスガイド には、他の質問に答えることができるかなりの情報があります。

11
laz

詳細はプロバイダー固有です。 JCAリファレンスガイド は次のように述べています。

(暗号オブジェクトの作成)モードまたはパディングが指定されていない場合、モードおよびパディング方式のプロバイダー固有のデフォルト値が使用されます。たとえば、SunJCEプロバイダーは、デフォルトモードとしてECBを使用し、DES、DES-EDE、およびBlowfish暗号のデフォルトパディング方式としてPKCS5Paddingを使用します。つまり、SunJCEプロバイダーの場合、Cipher.getInstance( "DES")とCipher.getInstance( "DES/ECB/PKCS5Padding")は同等のステートメントです。

私は常に完全な形式(アルゴリズム/モード/パディング)を使用します。実装にそのような「詳細」を省くことは悪い習慣だと思うだけでなく、選択したプロバイダー(通常は1つ)に依存しない暗号文を実現するためにもストレージ/送信用に暗号化すると、同じプロバイダーが後で/もう一方の端で使用されることを確認できません)。

10
Javier

それはプロバイダーに依存します。プロバイダーによって、デフォルトのパラメーターが異なる場合があります。これは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実装では利用できない場合がある特定のプロバイダーに関連付けられています

3
Qiuxiang Dong