2012-08-12 45 views
6

我正在開發一個應加密一些小(小於1MB)和大(大約500MB)文件的應用程序。
如何加密文件並在磁盤上的某個位置有效保存加密版本(即快速)?
如果花費時間,我可以進行加密嗎?在java中使用AES有效加密文件

+0

多少安全,你需要:

這樣的例子在這個問題被提及?通常,加密越弱,速度越快,反之亦然。 – 2012-08-12 06:37:18

+1

您可以使用'BouncyCastel' API。 – 2012-08-12 06:42:58

+0

@NoxHarmonium:我應該如何測量它? ;-)我需要儘可能安全的文件。我不在乎加密速度慢,我只希望它能以最大速度工作。 (我的意思是使用'java.io'和'java.nio'進行文件拷貝) – RYN 2012-08-12 06:43:30

回答

6

假設你有一個AES密鑰和一些輸出流,這裏是你如何添加一個加密裝飾器到流中。

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
enc.init(Cipher.ENCRYPT_MODE, key); 
AlgorithmParameters params = enc.getParameters(); 
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class); 
out.write(iv.getIV()); 
out = new CipherOutputStream(enc, out); 

這將IV添加到密文的開頭;當解密時,你需要解析出來初始化密碼。

長期來看,更好的解決方案是使用實現加密消息語法的庫,這是S/MIME的基礎。它記錄有關可用於解密的算法和密鑰的元數據。

如果你的提供者實現它,我還會推薦一個像GCM或CCM這樣的AEAD模式。 (SunJCE不會)。這些將驗證文件是否正確解密,並且沒有被破壞。

+0

@owlstead我知道現在有GCM的API,並且期望SunJCE提供它,但是當我去檢查時,我找不到它[在文檔中](http://docs.oracle.com)。您是否知道Oracle有義務通過包含的JCE提供商提供該服務? – erickson 2012-08-12 15:39:52

+1

糟糕我的道歉,我可能在那裏使用了非標準的構建路徑。來源:「* Java SE已經在JDK 7中定義了AEAD/GCM接口。在JDK 8中,JCA/JCE提供程序將實現這些AEAD/GCM接口。如果我們還添加了一些額外的PKCS11機制,當前的PKCS11標準支持它。*「 – 2012-08-12 17:33:20

+0

當然,Bouncy Castle API確實包含一個執行GCM模式的實現。我會在結束我的斯坦福大學加密課程後嘗試將其構建到提供程序中。 – 2012-08-12 17:38:44