2012-05-02 22 views
1

有沒有人知道這段代碼有什麼問題?帶AES/ECB128/PKCS5Padding的密碼總是拋出「沒有這樣的算法」異常

Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE"); 
  • 算法:AES
  • 操作方式:歐洲央行(與128附加到指定塊大小)
  • PaddingSchemce:PKCS5Padding

這似乎是正確的我,但它不斷在實例化過程中拋出「No such algorithm」異常。

+2

您不能在'ECB'之後輸入數字,因爲該模式僅支持每個加密的完整塊。你只能在有意義的模式之後放置一個數字,比如CFB,OFB和CTR模式。 –

回答

5

什麼也沒有,但我的類路徑股票JDK,我跑這個代碼片斷,並在輸出grepped爲AES:

for (Provider provider: Security.getProviders()) { 
    System.out.println(provider.getName()); 
    for (String key: provider.stringPropertyNames()) 
    System.out.println("\t" + key + "\t" + provider.getProperty(key)); 
} 

我看到這行:

Cipher.AES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING 

這表明我你的填充支持。

我也看到了這條線:

Cipher.AES SupportedModes  ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128 

我注意到,歐洲央行出現在這裏,但ECB128沒有,所以我不知道如果是這樣的問題。我要承認我不知道這些信息是否正確。

編輯添加: 我可以用ECB而不是ECB128調用Cipher.getAlgorithm(「AES/ECB/PKCS5Padding」)。它看起來像我與ECB一樣,你不能指定塊的大小,至少在這裏有什麼可用的。不知道這對你是否足夠。

+0

謝謝。但是我查看了JDK文檔,他們說附加的數字應該是IN BYTES的長度。所以我猜'ECB16'應該可以工作。 –

+1

@OneTwoThree雖然JCA [Cipher轉換](http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#trans)doc表示_you可以選擇指定通過將該編號附加到模式名稱_一次來處理位,並非所有模式都支持它。請參閱JCA [標準算法名稱文檔](http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html)中的「密碼算法模式」部分。 –

+0

@一二三,大家知道,CBC比歐洲央行更安全。雖然你將不得不處理一個初始化向量。 –

1

Sun JCE提供程序有所限制。嘗試使用BouncyCastle JCE提供程序(http://www.bouncycastle.org/)。

+0

我其實從未使用Sun JCE以外的任何提供程序。所以如果我想使用BoyncyCastle。我應該把他們的名字放在ctor嗎? –

+1

這裏肯定不需要。 –

+0

要添加提供者,您可以將其添加到您的java.security文件中,也可以通過編程方式添加它。以下是關於bouncycastle.org網站的說明:http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation。另外你應該在oracle的網站上查看關於JCA/JCE的ORACLE文檔以獲取詳細信息。 – Sanjeev

3

AES的靜態塊大小爲128位(或16字節)。 Rijndael,用於創建AES的密碼確實具有多個塊大小。在調用init方法期間配置密鑰時,密鑰大小會自動拾取。

模式後面的位不用於配置密碼的塊大小。它們用於配置Cipher Feedback (CFB) mode of operation的反饋大小。但現在這是一個相當模糊的模式,特別是如果不是所有的塊加密位都被使用的話。儘管它們也可以正式用於OFB模式may be security issues when specifying smaller feedback sizes。應該保留這兩種模式以提供對傳統協議的支持。

如果使用的話,"CFB""OFB"字符串後面的值應該大於0且不大於塊大小,增量爲8.該數字被指定爲反饋位的數量,並且 - 像大多數加密API一樣 - Java的JCE僅限於處理字節。

相關問題