2016-07-23 3 views
1

アムと比較。 私のニーズに合った城を使用しています 私は通常大きなデータ(512MB +)のストリームを暗号化する必要があります。 暗号化のオーバーヘッドを理解するためにパフォーマンステストを実行すると、暗号化されていないデータよりも暗号化が30-40%ほど高価になることがわかりました。 これは予想されますか?JavaのAES/CBC/PKCS5Paddingストリームの暗号化性能を持つ公開鍵AES/CBC/PKCS5Paddingを使用して自分のデータを暗号化し、16バイトのランダム鍵を暗号化RSAキー/ペアを使用して標準的な技術を使用して暗号化なし

サンプルコード

public InputStream encryptStream(InputStream streamToEncrypt, byte[] key, byte[] iv, byte[] encryptedKey // 256 bytes) { 

     final Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, key, iv); 
     byte[] civ = cipher.getIV(); 
     ... 
     ByteArrayInputStream ivEncryptedKeyStream = new ByteArrayInputStream(ivEncryptedKeyArray); 
     CipherInputStream encrypted = new CipherInputStream(streamToEncrypt, cipher); 

     return new SequenceInputStream(ivEncryptedKeyStream, encrypted); 
    } 

他の場所

InputStream encryptedStream = ...encryptStream(plainStream, key, iv, encKey); 
IOUtils.copyLarge(encryptedStream, outputStream); 

私はJavaサーバの引数と周り果たしています。 AES-NIの命令セットがオンになっていることを確認しました。 大きなストリームを暗号化する際に予想されるオーバーヘッドについて考えてみたいですか?

編集:私はちょうど鍵ペアの生成にはBouncyCastle使用しています修正された情報。セキュリティプロバイダとしてSunJCEを使用するAES暗号化用。

+1

は、あなたがチェックしましたか? [AES-NI組み込み関数はデフォルトで有効になっていますか?](http://stackoverflow.com/questions/23058309/aes-ni-intrinsics-enabled-by-default) – Robert

+0

ありがとうございます。私はこれらの引数を試してみたところ、-server引数でパフォーマンスがわずかに向上することも確認しました。私はこのことについてさらに詳しく見ていきます。 – sunny

答えて

3

Oracle Java APIに既に含まれているすべてのものに対してBouncy Castleを使用するという考えは私を逃れます。 Bouncyはソフトウェアのみライブラリであるため、AES-NIではBouncyを有効にしません。 JavaはAESFastEngineを魔法のようにハードウェアの指示に置き換えることはありません。スピードを持たせたい場合は、Oracleの実装を使用してください。

オーバーヘッドに関しては:はい、オーバーヘッドが必要です。パーセンテージと他の計算との比は、もちろん、マシンと他の計算のパフォーマンスに依存します。 40%は合理的な期待になるかもしれない。

注:

  • それはまた、RSAの操作をスピードアップするかもしれませんので、最新のJavaバージョンはまた、BigIntegerの操作のためのCPU命令を使用します。 Java用
  • 使用してPKCS#1パディングおよび/またはAES CBCは(場合、それらは、トランスポートプロトコルにおいて、例えば、適用される)パディングオラクル攻撃への暗号文が脆弱になり、
  • 十分に大きなテストセットを使用することを忘れないでください.JITのコンパイルと最適化は比較的遅く始まるかもしれません。お使いのJavaバージョンは、AES-NIを使用している場合
+0

指摘してくれてありがとう、私は情報を修正しました。実際にストリームを暗号化するためにOracle Java APIを使用しています。私は大規模なテストセットを試してみるでしょうが、私はすぐにサンプルサイズが10MBと10000ファイルの3MBの違いを見ています。 10000ファイルのテストでは、パフォーマンスへの影響は約30%です。私は次に大きなファイルに対してベンチマークを試みますが、理論的には大きなファイルは大きな影響を与えますか、それとも重要ではないでしょうか? – sunny

+1

@sunnyいいえ、別のVMを使用しない限り、パフォーマンス上のメリットは小さい可能性があります。 30 GBが既にテストされているようですが、コードはそれまでに最適化されます。キーの折り返しとAESのキースケジュールにはいくらかの影響があるかもしれませんが、それはあなたの調査結果に過度に影響することは考えにくいでしょう。 –

+0

これは、Javaの代わりに最適化されたCまたはC++ルーチンを使用する数少ない場所の1つです。Javaの暗号化は、組み込み関数の場合でもネイティブコードに比べて比較的遅いです。スクリプティング言語と比べると驚くほど高速です。 –

関連する問題