it-swarm-eu.dev

Diverse prestazioni della velocità openssl sullo stesso hardware con AES 256 (EVP e API non EVP)

Se corro openssl 1.0.1e in questo modo:

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

Tuttavia, se lo eseguo in questo modo:

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

Dal documentazione OpenSSL , sembra che usare EVP per lo stesso codice o non usare EVP non dovrebbe fare alcuna differenza. Sì, lo vedo costantemente. Qualcuno può fornire una visione? Ho cercato su Google molto ma non sono riuscito a trovare nulla. Esaminerò il codice ma non sono sicuro di poter capire quella parte.

26
Ramana

Nel codice sorgente OpenSSL, la funzione speed aes-256-cbc Chiama AES_cbc_encrypt() che a sua volta utilizza AES_encrypt(), una funzione di crypto/aes/aes_x86core.c. È una ovvia implementazione "classica" con tabelle.

D'altra parte, con EVP, si finisce nel codice in crypto/evp/e_aes.c Che rileva dinamicamente se la CPU corrente supporta istruzioni AES-NI , una caratteristica dei recenti processori x86, che consentire prestazioni notevolmente migliorate. Nel codice OpenSSL, la macro AESNI_CAPABLE Fa il lavoro (nutrendosi di alcuni flag che vengono impostati quando la libreria viene inizializzata, usando CPUID ).

In conclusione: con EVP, puoi beneficiare della selezione automatica dell'implementazione migliorata, basata sul modello di CPU corrente, mentre il codice non EVP direttamente utilizza l'implementazione del software generico, che funziona ovunque, ma è più lento.

31
Tom Leek

Un'altra cosa da notare:

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

Senza API EVP, in 3.00s, elaborato 14.388.425 (~ 14M)
Con API EVP, in 3.00s, elaborato 71.299.827 (~ 71M)

È ovviamente elaborato più velocemente in modalità EVP.

4
user90835