2012-03-26 28 views
1

ファイルを暗号化および復号化するアプリケーションを作成しています。私はCipherInputStreamとCipherOutputStreamを暗号化/復号化プロセスにAES256ビット暗号を使用して使用しています。AES256暗号化/復号化の速度

私の問題は、私がバイト配列を取って、ファイルを書き込むときに暗号化を行うと、バイト配列を作成するファイルを復号化するよりも約2倍の時間がかかります。 AESの暗号化と復号化は対称プロセスであり、完了までには同じ時間がかかるので、奇妙です。

アイデア?

+1

コードのプロファイル方法を学びます。あなたが言うように、AESの暗号化と解読は同じ速度なので、違いはどこかにあるはずです。 –

+0

詳細はこちらです。ファイルをバイト配列に読み込んだ後、メモリ内で解読または暗号化すると、同じ時間がかかります。しかし、CipherInputStream/CipherOutputStreamを使用すると、処理時間に顕著な違いがあります。 –

答えて

5

Stackoverflowには、Androidでの低速I/O操作についての不満がたくさんあります。非常に多くの場合、書き込み操作を実行するにはブロックサイズが問題になります。

スマートフォンで使用されるフラッシュメモリは、数キロバイトの大きなブロックで構成されています。したがって、最適な書き込み速度を得るには、4KBまたはそれ以上のブロックだけを書き込む必要があります。

AESのような暗号は、8バイトのブロックでブロック単位で動作します。これにより、大量のパフォーマンスが低下する可能性があります。

CipherOutputStreamの出力をバッファサイズ4または16 KBのBufferedOutputStreamで送信することをお勧めします。これはプロセスを大幅に高速化するはずです。

また、フラッシュメモリへの書き込みは常に読み込みより遅いと考える必要があります。

+0

はい、それは奇妙なことでした。私の暗号化 - 書き込みプロセスは、読み取り - 復号化プロセスよりも高速です。 –

+2

おそらく、CipherInputStreamが内部バッファリングを使用し、FileOutputStreamを使用して直接バイトを書き込むと、そのバイトがバッファされない*ためです。バッファの作成は、ファイルを読み書きするときに常にお勧めします。これは、解読後にファイルを再度ディスクに書き込むことを前提としています。 –

2

コードがどのように見えるかわかりません。

同様の遅い解読問題が修正されました。私の元のコードは最も人気のあるAndroidの暗号化/復号化の例を参照していました。暗号化にはCipherOutputStreamを使用し、復号化にはCipherInputStreamを使用します。私は解読が暗号化の約4倍遅いことを発見しました。最終的に問題がCipherInputStreamであることがわかりました。それはCipherOutputStreamよりもずっと遅いです。この問題を解決するには、暗号化と復号化の両方にCipherOutputStreamを使用し、Cipherを暗号化から復号化に切り替えます。その後、復号化は暗号化と同じくらい速くなります。

これは、復号化されたファイルをファイルに出力したくない場合に、これを実現する他の方法です。たぶん、暗号ストリームをまったく使用しないかもしれません。バッファーを復号化するだけです。私はまだそれを試していない。

+0

あなたはコードを共有できますか? –