与 lcrypto 链接的程序比 openssl 命令慢很多倍
program linked with lcrypto is many times slower than openssl command
我有一个简单的 C
程序用于 aes256 加密。它与 openssl 库链接 (-lcrypto
)。该程序的核心是以下几行:
AES_set_encrypt_key(key32 ,256 ,&aes_ks3);
while( len = fread( buf ,1 ,4096, fp) ){
if( 4096 != len )
break;
AES_cbc_encrypt(buf ,buf ,len ,&aes_ks3 ,iv ,AES_ENCRYPT);
fwrite(buf ,1 ,len ,wfp);
}
AES_cbc_encrypt(buf ,buf ,len+padding_len ,&aes_ks3, iv,AES_ENCRYPT);
fwrite(buf ,1 ,len+padding_len ,wfp);
我只使用标准的 openssl 库函数进行加密(即,我没有使用我自己的函数)。我可以通过 openssl
命令使用相同的密钥和 IV 加密相同的文件:
openssl enc -aes-256-cbc -in FILE.in -out FILE.out -K $key -iv $iv
我得到了相同的输出文件(从而验证我的程序是否正常工作)。
然而,我的程序始终运行比 openssl
命令慢 4-5 倍。他们都使用相同的例程,abd 都链接到同一个库。
这怎么可能?
我该如何调查原因?
更新:
以下是使用 1) openssl、2) 我的程序加密同一文件的实际数字:
1) openssl:
real 0m0.238s
user 0m0.196s
sys 0m0.040s
2)我的程序:
real 0m1.006s
user 0m0.964s
sys 0m0.040s
通过直接调用 AES 函数,您将失去 EVP layer. In particular, the EVP layer supports AES intrinsics 提供的所有优化,这在支持它们的 CPU 上产生巨大差异。
我有一个简单的 C
程序用于 aes256 加密。它与 openssl 库链接 (-lcrypto
)。该程序的核心是以下几行:
AES_set_encrypt_key(key32 ,256 ,&aes_ks3);
while( len = fread( buf ,1 ,4096, fp) ){
if( 4096 != len )
break;
AES_cbc_encrypt(buf ,buf ,len ,&aes_ks3 ,iv ,AES_ENCRYPT);
fwrite(buf ,1 ,len ,wfp);
}
AES_cbc_encrypt(buf ,buf ,len+padding_len ,&aes_ks3, iv,AES_ENCRYPT);
fwrite(buf ,1 ,len+padding_len ,wfp);
我只使用标准的 openssl 库函数进行加密(即,我没有使用我自己的函数)。我可以通过 openssl
命令使用相同的密钥和 IV 加密相同的文件:
openssl enc -aes-256-cbc -in FILE.in -out FILE.out -K $key -iv $iv
我得到了相同的输出文件(从而验证我的程序是否正常工作)。
然而,我的程序始终运行比 openssl
命令慢 4-5 倍。他们都使用相同的例程,abd 都链接到同一个库。
这怎么可能?
我该如何调查原因?
更新:
以下是使用 1) openssl、2) 我的程序加密同一文件的实际数字:
1) openssl:
real 0m0.238s
user 0m0.196s
sys 0m0.040s
2)我的程序:
real 0m1.006s
user 0m0.964s
sys 0m0.040s
通过直接调用 AES 函数,您将失去 EVP layer. In particular, the EVP layer supports AES intrinsics 提供的所有优化,这在支持它们的 CPU 上产生巨大差异。