2009-02-25 60 views
13

我們有要求在Java中進行一些Rijndael開發。Java中的Rijndael支持

對文章,圖書館等有幫助我們的建議嗎?

任何指針密鑰庫的維護和如何存儲密鑰安全?

編輯:

它需要是開源的。實質上,它只是使用Rijndael進行數據的標準加密/解密。

+0

Rijndael == AES – lImbus 2009-05-20 19:27:27

回答

21

Java包括開箱即用的AES。 Rijndael是AES。你不需要任何外部庫。你只需要這樣的東西:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post 
byte[] iv = null ; //Ditto 
byte[] plaintext = null; //Whatever you want to encrypt/decrypt 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
//You can use ENCRYPT_MODE or DECRYPT_MODE 
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv)); 
byte[] ciphertext = cipher.doFinal(plaintext); 

就是這樣,加密/解密。如果你正在處理大量的數據,那麼你最好閱讀16個字節的倍數的塊,並調用update而不是doFinal(你只需在最後一塊調用doFinal)。

+7

Rijndael不等於AES,而是AES有一些限制 - 固定塊大小爲128位,並且某些加密模式不受支持。任何完整的AES實現應該可用作Rijndael。 – Cheeso 2009-05-13 01:48:49

+14

這恰恰相反,AES是Rijndael的子集 – 2012-01-06 14:50:04

1

javax.crypto中具有AES支持:http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

至於安全密鑰存儲,通常的方法是使用密碼散列函數以導出從用戶輸入(口令)的加密密鑰,並使用導出的密鑰來加密鑰匙串。或者,如果您只需要一個密鑰,則可以使用派生密鑰本身。

始終牢記的是,系統的安全性直接關係到使用的哈希函數的強度。如果可能的話,使用加密安全的散列函數和鹽,並且散列不止一次(例如數百次)。

這就是說,問題非常模糊。

+0

值得注意的是`javax.crypto`使用了一個非常優化的AES版本,速度很快。 – tony9099 2015-05-03 11:50:45

5

對於一個偉大的免費的圖書館,我強烈建議BouncyCastle.這是積極維護,高品質,並具有代碼示例一個很好的陣列。對於參考文檔,你就必須更多地依靠廣大JCE docs.

我不能說我們用什麼庫,以滿足FIPS認證要求。但CryptoJ的替代品要多得多,便宜得多。

在一般情況下,我建議你產生每個你喜歡的Rijndael對稱密碼加密消息,一個新的密鑰進行加密,然後用非對稱算法如RSA這把鑰匙。這些私鑰可以存儲在受密碼保護的基於軟件的密鑰存儲中,如PKCS#12或Java的「JKS」,或者爲了更好的安全性,可以將其存儲在「智能卡」硬件令牌或其他加密硬件模塊上。

3

由於我公司最近發現,AES是不太Rijndael算法。 AES有限制,密鑰必須是128,192或256位 - 然而,Rijndael允許160和224密鑰。

正如上面的erickson所指出的,BouncyCastle提供了一個Rijndael對象,它支持額外的密鑰長度:128/160/192/224/256位。具體來說,看看輕量級API。

Gnu-crypto是另一個開源庫 - 但是,它也不支持160和224位密鑰。

所以,如果你正在尋找完整的Rijndael支持,那麼BouncyCastle是我迄今爲止唯一找到的。