我試圖使用AES算法加密數據。 但是,發生以下異常。java.security.NoSuchAlgorithmException:找不到任何支持AES/ECB/PKCS7PADDING的提供商
java.security.NoSuchAlgorithmException:
Cannot find any provider supporting AES/ECB/PKCS7PADDING
有人知道這個問題的解決方案? 我的JDK版本是1.7。
我試圖使用AES算法加密數據。 但是,發生以下異常。java.security.NoSuchAlgorithmException:找不到任何支持AES/ECB/PKCS7PADDING的提供商
java.security.NoSuchAlgorithmException:
Cannot find any provider supporting AES/ECB/PKCS7PADDING
有人知道這個問題的解決方案? 我的JDK版本是1.7。
您不想爲分組密碼使用指定PKCS#7填充。你想指定PKCS#5填充。 PKCS#5被指定用於分組密碼,而PKCS#7不是(它用於不同的地方,如在S/MIME中)。我將指出PKCS#5和PKCS#7實際上指定了完全相同類型的填充(它們是相同的!),但在此上下文中使用時稱爲#5。 :)
因此,而不是"AES/ECB/PKCS7PADDING"
,你想要"AES/ECB/PKCS5PADDING"
。這是一個密碼實現,每個Java平臺的實現都需要支持。有關更多詳細信息,請參閱documentation of the Cipher
class。
非常感謝您的回答。那麼JCE提供商不支持PKCS7PADDING? – 2012-04-17 15:56:40
正確。它沒有(好吧,因爲#5和#7是相同的填充...我想你可以說它是這樣做的)。而且,不客氣。如果您滿意,請記住接受答案。 :) – jeffsix 2012-04-17 15:57:37
這個答案沒問題,但有點令人困惑,因爲你*想*使用PKCS#7填充分組密碼。根據[Standard Algorithm Names。](http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Cipher)PKCS,「PKCS7Padding」是錯誤的名稱#7使用此填充方案填充用分組密碼加密的消息。無論大背景是什麼。 – erickson 2012-04-17 17:53:25
,如果你想使用AES/ECB/PKCS7Padding然後充氣城堡將支持HT tp://www.bouncycastle.org/specifications.html
真的,但是它下面是相同的填充算法。 – 2015-01-24 22:39:54
對於包括PKCS#5和PKCS#7加密標準文本中的問題的一個非常全面的解釋,請看看here。
PKCS#5填充表示填充1到8個字節。填充字節本身包含以字節編碼的填充字節數量。 PKCS#5填充是爲DES指定的,但它適用於塊大小爲8字節的任何塊密碼。
現在DES規範甚至基於密碼的PKCS#5規範的加密優先於Java和Java相當長的時間。 AES在2002年才被標準化,在Java甚至Java 2引入之後很久。所以在AES出現之前,(三重)DES和PKCS#5填充已經集成到Java中。
當Java - 或者更準確地說,Sun JCE提供者 - 獲得了AES功能時,它需要一個16字節塊大小的填充方法。 PKCS#7指定了這種填充方法is identical to PKCS#5 padding,除了它是爲2到255個字節的塊大小(如果它編碼基於零的無符號整數的字節的最大值)定義的。但是,填充方法已經在那裏了;它被命名爲"PKCS5Padding"
。因此,不要引入新名稱,而是簡單地重新使用"PKCS5Padding"
。
現在,Sun提供商應該真的支持"PKCS7Padding"
,因爲PKCS#5填充不正確。這不僅僅是Java命名問題,任何試圖實現加密協議或將其他應用程序移植到Java的開發人員都會遇到問題。但現在,您應該使用"PKCS5Padding"
而不是"PKCS7Padding"
。
請注意,ECB不是CPA安全的,而是使用CBC(如果您只是希望存儲數據的機密性)。 – 2015-01-24 22:53:27