4

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
4

1 に答える 1

1

このMSDN ブログ投稿で説明されているように、Windows 8 より前では問題なく動作していた機能を明らかに破ったため、これは Microsoft からのかなり不十分な動きですが、現在は機能していません。

Windows 8 では、プロファイラーは以前のバージョンの Windows とは異なる基盤となるテクノロジを使用します。これが、Windows 8 での動作が異なる理由です。現在、NGEN 化されたイメージ内で実行されています。

(...)

ただし、Visual Studio の次のバージョンで実装する予定です。

この投稿では、PDB ファイルを自分で生成する方法を説明しています (ありがとう!)。

于 2013-02-07T06:14:19.337 に答える