2013-03-21 74 views
11

我正在開發的項目有一個需要AES加密和解密的細分市場。從我可以查找的所有可能的互聯網源中,很難找到任何有關AES256加密的參考,而無需從Sun(現在的Oracle網站)下載並安裝Unlimited Strength JCE文件。除了分發相同的法律問題之外,當詢問最終用戶訪問特定網站並下載某些文件,將它們放在一個目錄中,然後將其添加到類路徑中時,它不會幫助我們非常實際在Windows等!在沒有無限強度的JCE文件的情況下,AES256加密解密可能在Java中嗎?

有互聯網BountyCastle輕量級的API,它可能並不需要JCE文件上的一些參考,但我擡不起頭來這表明這是一個非常相關的參考或示例。

不確定,但這是每個其他編程語言的問題嗎?

如果它是不可能有256位AES加密,而不那些安裝這些特定的JCE文件,那麼可以在JNI辦法幫助?

要詳細一點,可以AES 256加密來在C/C++完成,然後我可以調用使用JNI以具有期望的結果的那些?打包軟件(作爲jar文件)是否會引起關注,還是可能存在其他問題?

是進場的另一個重要因素是,該項目將同時運行Mac和Windows的,所以可以只使用C/C++(具體的編譯器/解釋器版本或任何東西)限制?

有沒有不同的方法來處理這個問題?任何其他方法?

+2

歡迎來到[SO]。我冒昧地刪除了一些並非真正必要的文字。我們喜歡我們的問題簡潔,這個已經很長很長沒有文字;-) – 2013-03-21 15:34:48

+2

我想你可以在這裏找到一個Java AES實現:https://jce.iaik.tugraz.at/但我認爲它只是免費的研究/生。 – HectorLector 2013-03-21 15:45:15

+0

不要忘記upvote或接受答案,諾拉... – 2013-05-05 09:33:23

回答

5

首先,不是每個編程環境都沒有問題。例如,用C編寫的OpenSSL支持大型密鑰。從JCE和JNI的經驗來看,我會建議你找到使用純Java的方法,而不是通過JNI加載本地庫。這很容易。

一個實用的解決方案: 您的應用程序是否在安裝過程中使用某種安裝程序安裝?如果是這樣,那麼一種解決方案可能是使用這個安裝程序來安裝JCE。

BouncyCastle的不幸還採用JCE在他們的FAQ說明。

UPDATE 1: 我發現這個庫可能是你正在尋找的。它似乎並沒有維持下去但是:http://www.cryptix.org/

更新2: GNU有它實現AES256庫:http://www.gnu.org/software/gnu-crypto/。更多關於這裏的可用的密碼:http://www.gnu.org/software/gnu-crypto/manual/Ciphers.html

使用GNU-加密因爲你已經在你的鑰匙裝在 key_bytes

代碼示例:

IBlockCipher cipher = CipherFactory.getInstance("AES"); 
Map attributes = new HashMap(); 
attributes.put(IBlockCipher.CIPHER_BLOCK_SIZE, new Integer(16)); 
attributes.put(IBlockCipher.KEY_MATERIAL, key_bytes); 
cipher.init(attributes); 
int bs = cipher.currentBlockSize(); 

for (int i = 0; i + bs < pt.length; i += bs) 
{ 
    cipher.encryptBlock(pt, i, ct, i); 
} 

for (int i = 0; i + bs < cpt.length; i += bs) 
{ 
    cipher.decryptBlock(ct, i, cpt, i); 
} 

請確保您使用加密的安全隨機數發生器如SecureRandom以創建256個字節的關鍵:

byte[] seed = xxx; // Be sure to get a good new seed on every client machine. 
SecureRandom random = new SecureRandom(seed); 
byte[] key_bytes = new byte[256]; 
random.nextBytes(key_bytes); 
+4

Bouncycastle輕量級API不*使用JCE,因此不受無限權限加密文件的需要。 – 2013-03-21 20:38:54

+0

@GregS用它作爲答案的基礎 – 2013-03-23 15:40:17

+0

指向未維護的加密庫通常應該以-1結尾,但是我將保留它作爲其他信息是正確的。 – 2013-05-05 09:31:18

6

密鑰大小限制在Cipher級的Java實現。有可能使用任何實現AES來獲得AES-256功能的類別其他類別。例如,可以使用Bouncy Castle的「輕量級」API來使用任何強度的密鑰大小。在這種情況下,你可以例如使用org.bouncycastle.crypto.engines.AESFastEngine直接(和mode和您所選擇的padding,它仍然可以正常使用的.jar的充氣城堡,但你不會使用BouncyCastle的提供商的JCA功能。

這有一些缺點和輕量級的Bouncy Castle API,它的功能比通過"BC"提供程序添加到Sun類中的JCA功能要低一些。此外,很多組件(例如Java,JSSE或XML加密庫中的SSL層)使用JCA提供所需的加密功能,需要JCA功能的庫仍將受限於密鑰的大小限制

N注意使用其他供應商將不起作用,因爲Cipher類本身會檢查密鑰大小。可能包含在JCA提供者中的CipherSpi實現類不能(積極)影響允許的密鑰大小。你只能直接使用實現類。

+0

[鏈接](http://www.bouncycastle.org/documentation.html)幫助 – Norah 2013-04-13 18:43:44

相關問題