Rendimiento diferente de la velocidad de openssl en el mismo hardware con AES 256 (EVP y API no EVP)

24

Si ejecuto openssl 1.0.1e de esta manera:

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

Sin embargo, si lo ejecuto así:

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

De la documentación de OpenSSL , parece que usar el EVP para el mismo cifrado o no usar el EVP debería No hace ninguna diferencia. Sí, lo veo constantemente. ¿Alguien puede por favor proporcionar una visión? He buscado mucho en Google pero no pude encontrar nada. Revisaré el código, pero no estoy seguro si puedo entender esa parte.

    
pregunta Ramana 29.04.2013 - 15:19
fuente

2 respuestas

29

En el código fuente de OpenSSL, la función speed aes-256-cbc llama a AES_cbc_encrypt() , que a su vez usa AES_encrypt() , una función de crypto/aes/aes_x86core.c . Es una implementación obvia "clásica" con tablas.

Por otro lado, con EVP, terminas en el código en crypto/evp/e_aes.c que detecta de forma dinámica si la CPU actual admite el Instrucciones de AES-NI , una característica de los procesadores x86 recientes, que permiten un rendimiento enormemente mejorado. En el código OpenSSL, la macro AESNI_CAPABLE hace el trabajo (se alimenta de algunos indicadores que se configuran cuando se inicializa la biblioteca, utilizando CPUID ).

Línea inferior: con EVP, se beneficia de la selección automática de la implementación mejorada, basada en el modelo de CPU actual, mientras que el código que no es EVP utiliza directamente la implementación de software genérica, que funciona En todas partes, pero es más lento.

    
respondido por el Tom Leek 29.04.2013 - 16:43
fuente
3

Una cosa más a tener en cuenta:

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

Sin la API de EVP, en 3.00s, procesamos 14,388,425 (~ 14M)
Con la API de EVP, en 3.00s, se procesaron 71,299,827 (~ 71M)

Obviamente, se procesa más rápido en el modo EVP.

    
respondido por el user90835 02.11.2015 - 04:05
fuente

Lea otras preguntas en las etiquetas