Openssl 1.0.1eを次のように実行すると、
$ ./openssl speed aes-256-cbc (i.e without EVP API)
Doing aes-256 cbc for 3s on 16 size blocks: 14388425 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 3861764 aes-256 cbc's in 2.99s
Doing aes-256 cbc for 3s on 256 size blocks: 976359 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 246145 aes-256 cbc's in 2.99s
Doing aes-256 cbc for 3s on 8192 size blocks: 30766 aes-256 cbc's in 3.00s
ただし、次のように実行すると、
$ ./openssl speed -evp AES256
Doing aes-256-cbc for 3s on 16 size blocks: 71299827 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 64 size blocks: 18742055 aes-256-cbc's in 2.99s
Doing aes-256-cbc for 3s on 256 size blocks: 4771917 aes-256-cbc's in 2.99s
Doing aes-256-cbc for 3s on 1024 size blocks: 1199158 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 8192 size blocks: 150768 aes-256-cbc's in 2.99s
OpenSSLドキュメント から、同じ暗号にEVPを使用しても、EVPを使用しなくても、違いはないようです。はい、一貫して見ています。誰でも洞察を提供できますか?たくさんググってみましたが何も見つかりませんでした。コードを調べますが、その部分を理解できるかどうかはわかりません。
OpenSSLソースコードでは、_speed aes-256-cbc
_関数が_crypto/aes/aes_x86core.c
_の関数であるAES_cbc_encrypt()
を使用するAES_encrypt()
を呼び出します。これは、テーブルを使用した明らかな「クラシック」実装です。
一方、EVPを使用すると、現在のCPUが AES-NI命令 をサポートするかどうかを動的に検出する_crypto/evp/e_aes.c
_のコードが作成されます。これは、最近のx86プロセッサの機能で、大幅に改善されたパフォーマンス。 OpenSSLコードでは、_AESNI_CAPABLE
_マクロが仕事をします(ライブラリが初期化されるときに設定されるいくつかのフラグをフィードします [〜#〜] cpuid [〜#〜] )。
ボトムライン:EVPを使用すると、現在のCPUモデルに基づいて、改善された実装を自動的に選択することができますが、EVP以外のコードは直接どこでも機能する一般的なソフトウェア実装を使用しますが、速度は遅くなります。
もう1つ注意すべき点があります。
$ ./openssl speed aes-256-cbc (i.e without EVP API)
Doing aes-256 cbc for 3s on 16 size blocks: 14388425 aes-256 cbc's in 3.00s
$ ./openssl speed -evp AES256
Doing aes-256-cbc for 3s on 16 size blocks: 71299827 aes-256-cbc's in 3.00s
EVP APIなし、3.00秒で14,388,425(〜14M)を処理
EVP APIを使用して、3.00sで71,299,827(〜71M)を処理
それは明らかにEVPモードでより速く処理されます。