web-dev-qa-db-fra.com

Performances différentes de la vitesse openssl sur le même matériel avec AES 256 (EVP et API non EVP)

Si je lance openssl 1.0.1e comme ceci:

$ ./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

Cependant, si je le lance comme ceci:

$ ./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

D'après la documentation OpenSSL , il semble qu'utiliser EVP pour le même chiffrement ou ne pas utiliser EVP ne devrait faire aucune différence. Oui, je le vois constamment. Quelqu'un peut-il donner un aperçu? J'ai beaucoup googlé mais je n'ai rien trouvé. Je vais parcourir le code mais je ne sais pas si je peux comprendre cette partie.

26
Ramana

Dans le code source OpenSSL, la fonction speed aes-256-cbc Appelle AES_cbc_encrypt() qui elle-même utilise AES_encrypt(), une fonction de crypto/aes/aes_x86core.c. C'est une implémentation "classique" évidente avec des tables.

D'un autre côté, avec EVP, vous vous retrouvez dans le code dans crypto/evp/e_aes.c Qui détecte dynamiquement si le CPU actuel prend en charge les instructions AES-NI , une caractéristique des processeurs x86 récents, qui permettre des performances considérablement améliorées. Dans le code OpenSSL, la macro AESNI_CAPABLE Fait le travail (en se nourrissant de certains indicateurs qui sont définis lors de l'initialisation de la bibliothèque, en utilisant CPUID ).

Résultat: avec EVP, vous bénéficiez de la sélection automatique de l'implémentation améliorée, basée sur le modèle CPU actuel, alors que le code non-EVP directement utilise l'implémentation générique du logiciel, qui fonctionne partout, mais est plus lente.

31
Tom Leek

Une dernière chose à noter:

$ ./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

Sans API EVP, en 3,00s, traité 14,388,425 (~ 14M)
Avec l'API EVP, en 3,00s, traité 71 299 827 (~ 71 M)

Il est évidemment traité plus rapidement en mode EVP.

4
user90835