System.Security.Cryptography
.NET のAES 実装と BouncyCastle.Org の AES を比較する小さなテスト ベンチマークを作成しました。
GitHub コードへのリンク: https://github.com/sidshetye/BouncyBench
AES-GCM は「より優れた」暗号化アルゴリズムであり、.NET には欠けているため、特に興味があります。私が気付いたのは、AES の実装は .NET と BouncyCastle の間で非常によく似ていますが、GCM のパフォーマンスは非常に低いということです (詳細については、以下の追加の背景を参照してください)。多くのバッファコピーか何かが原因であると思われます。さらに詳しく調べるために、コードをプロファイリングしてみました (VS2012 =>Analyze
メニュー バー オプション => Launch performance wizard
)。
質問: このような場合、何が CPU の大部分を消費しているのかをどのように把握できますか? 現在私が知っているのは、「Init() の一部の行/呼び出しが mscorlib.ni.dll 内の CPU の 47% を消費している」ということだけですが、特定の行がわからないため、どこを (試して) 最適化すればよいかわかりません。手がかりはありますか?
余分な背景:
David A. McGrew による " The Galois/Counter Mode of Operation (GCM) " ペーパーに基づいて、 " Multiplication in a binary field can use different time-memory tradeoffs. It can implement with no key-dependent memory. " を読みました。 、その場合、一般的に AES よりも数倍遅く実行されます。適度な量のメモリを犠牲にすることを厭わない実装は、AES よりも速い速度を容易に実現できます。」
結果を見ると、基本的な AES-CBC エンジンのパフォーマンスは非常によく似ています。AES-GCM は GCM を追加し、その下にある AES エンジンを CTR モード (CBC より高速) で再利用します。ただし、GCM は CTR モードに加えて GF(2^128) フィールドにも乗算を追加するため、他の領域で速度が低下する可能性があります。とにかく、それがコードのプロファイリングを試みた理由です。
興味のある方のために、私の簡単なテスト パフォーマンス ベンチマークはどこにありますか。Windows 8 VM と YMMV 内にあります。テストは構成可能ですが、現在はデータベースの多くのセルを暗号化する際の暗号オーバーヘッドをシミュレートすることです (=> 多くの小さな平文入力)
Creating initial random bytes ...
Benchmark test is : Encrypt=>Decrypt 10 bytes 100 times
Name time (ms) plain(bytes) encypted(bytes) byte overhead
.NET ciphers
AES128 1.5969 10 32 220 %
AES256 1.4131 10 32 220 %
AES128-HMACSHA256 2.5834 10 64 540 %
AES256-HMACSHA256 2.6029 10 64 540 %
BouncyCastle Ciphers
AES128/CBC 1.3691 10 32 220 %
AES256/CBC 1.5798 10 32 220 %
AES128-GCM 26.5225 10 42 320 %
AES256-GCM 26.3741 10 42 320 %
R - Rerun tests
C - Change size(10) and iterations(100)
Q - Quit