2012-08-12 12 views
6

私はいくつかの小さな(1MB未満)ファイルと大きなファイル(約500MB)を暗号化するアプリケーションを開発しています。
どのようにすれば、ファイルを暗号化し、暗号化されたバージョンをディスク上のどこかに効率的に(すなわち高速に)保存できますか?
暗号化に時間がかかっても問題はありませんか?JavaでAESを使用してファイルを効果的に暗号化する

+0

どの程度のセキュリティを必要としていますか?一般的に、暗号化が弱ければ速く、逆にすると暗号化が速くなります。 –

+1

あなたは 'BouncyCastel' APIを使うことができます。 –

+0

@NoxHarmonium:どうすれば測定できますか? ;-)私はできるだけ安全なファイルが必要です。私は暗号化が遅い気にしません。私はそれが行くことができる最大レートで動作したいだけです。 (私は 'java.io'と' java.nio'を使ってファイルコピーのようなものを意味します) – RYN

答えて

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/jp) com/javase/7/docs/technotes/guides/security/SunProviders.html)含まれるJCEプロバイダを使用してOracleから提供する約束を知っていますか? – erickson

+1

私のお詫びをお詫び申し上げますが、おそらく非標準のビルドパスを使用していました。ソースから:「Java SEは既にJDK 7でAEAD/GCMインターフェースを定義しています。JDK 8では、JCA/JCEプロバイダーがこれらのAEAD/GCMインターフェースを実装します。現在のPKCS11標準ではそれをサポートしています。* " –

+0

もちろん、Bouncy Castle APIにはGCMモードを実行する実装が含まれています。私はスタンフォード大学の暗号クラスを終了した後、プロバイダにそれを組み立てようとします。 –

2

Bhavikが上述したように、BouncyCastleは、軽量で成熟した、良い方法です。一度に読み書きする量を制御できるので、暗号化の進行状況を確実に確認できます。ファイルからバイトを読み取り、それらを暗号化してパイプラインの別のファイルに書き戻すことができます。

この例は、この質問に記載されている:あなたは How to encrypt a string/stream with bouncycastle pgp without starting with a file

関連する問題