2011-06-06 23 views
24

有誰知道默認的Java加密行爲是什麼:Java默認加密/ AES行爲

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

具體來說,我正在尋找了解這些類是如何產生的IV,以及什麼是默認的加密模式當只指定「AES」時。謝謝。

+2

不要報價我在此,但它可以很容易地取決於提供者。你真的想總是指定操作模式和填充算法。不這樣做會導致soooo很多問題... – 2011-06-06 21:10:25

+3

你能接受這些答案嗎?你最近的問題來自不久前,所以你應該還在身邊。 – 2012-12-08 00:19:27

回答

10

這些細節是提供程序特定的,依靠默認模式和填充可能會非常危險。如果您對目前與Java捆綁在一起的默認提供程序的價值感興趣,則必須搜索相關算法的源代碼。例如,它用於RSA算法的默認值是here。此外,Java™ Cryptography Architecture (JCA) Reference Guide有相當多的信息可以回答您其他一些問題。

26

對於Oracle JDK 7(已測試),AES的默認密碼是AES/ECB/PKCS5Padding。雖然Java安全性文檔沒有提及此問題(http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec),但必須做一些JUnit測試才能發現。

+3

我只能確認1.6.0_31在只有AES請求時也使用'AES/ECB/PKCS5Padding'。通過加密〜10MB的/ dev/urandom各種組合進行測試。 – Jesse 2012-11-01 08:38:20

+1

我一直在尋找這個小時!謝謝! – 2014-07-14 11:08:53

+1

@Jesse - ''Cipher.getAlgorithm()'應該返回你正在使用的東西。請參閱Java的[標準算法名稱文檔](http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html)。 – jww 2016-08-11 07:02:56

9

詳細信息是提供程序特定的。該JCA Reference Guide說:

(創建密碼對象),如果沒有指定模式或填充時,被用於模式和填充方案的特定於提供程序的默認值。例如,SunJCE提供程序使用ECB作爲默認模式,並使用PKCS5Padding作爲DES,DES-EDE和Blowfish密碼的默認填充方案。這意味着對於SunJCE提供者:Cipher.getInstance(「DES」)和Cipher.getInstance(「DES/ECB/PKCS5Padding」)是等價的語句。

我總是會使用完整的形式(算法/模式/填充),不僅是因爲我認爲,離開了這樣的「細節」的實施是不好的做法,同時也爲實現密文,是獨立的所選擇的提供者(通常爲存儲/傳輸進行加密,然後不能確定相同的提供者將在以後/在另一端使用)。

0

這取決於供應商。不同的提供者可能有不同的默認參數這是鏈接的Java 8.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider

的javax.crypto.Cipher.getInstance(串變換)工廠 方法生成使用形式 算法/模式/填充的變換密碼。如果忽略模式/填充,SunJCE 和SunPKCS11提供程序將ECB用作默認模式,將PKCS5Padding 用作許多對稱密碼的默認填充。

建議使用完全指定 算法,模式和填充的轉換,而不是依賴於默認值。

注:歐洲央行可以很好地用於數據的單塊,並且能夠 並行處理,但一般不應該用於 多個數據塊。

因此,您不應該只使用AES,而是指定模式和填充。此外,雖然getInstance方法可能對供應商的另一個參數,不建議這樣做,因爲

應用程序綁定到特定提供商可能無法提供 其他Java實現