OpenSSL AES_cbc_encrypt против интерфейсов EVP

Мне нужно шифровать долгоживущие потоки сетевых данных с помощью AES-CBC. Я думал, что позвоню EVP_EncryptInit_ex() только один раз и сохранить EVP_CIPHER_CTX для последующих звонков EVP_EncryptUpdate, Затем сделайте то же самое на конце расшифровки. Первая проблема, которую я обнаружил, это EVP_DecryptUpdate, которая всегда будет на один блок позади. Например, если я зашифрую 32 байта, 1-е обновление расшифровки вернет только 16, хотя я знаю, что оно расшифровало все 32 байта. Я думаю, это означает, что мне нужно позвонить EVP_DecryptFinal после каждого EVP_DecryptUpdate, а потом EVP_EncryptInit_ex() сбросить iv до следующего обновления.

Вторая проблема заключается в том, что у меня может быть много тысяч таких потоков, и я пытаюсь минимизировать использование памяти. sizeof(EVP_CIPHER_CTX) только 168 байт, но если я запрашиваю использование памяти до и после 1000 обращений к EVP_EncryptInit_ex()Похоже, что он выделяет дополнительные 412 байт на контекст (это выше 20 КБ после первого вызова).

ИСПРАВЛЕНИЕ, я вижу 412 байт на CTX, а не 168 + 412

AES_cbc_encrypt() Интерфейс выглядит намного лучше для моих нужд. Есть фиксированный 260 байт AES_KEY структура, плюс мне нужно поддерживать 16 байт IV самостоятельно. Однако, насколько я понимаю, он не использует аппаратное ускорение AES-NI Intel. https://security.stackexchange.com/questions/35036/different-performance-of-openssl-speed-on-the-same-hardware-with-aes-256-evp-an Есть ли способ включить AES-NI на AEC_cbc_encrypt() интерфейс? Является ли требование EVP в 2 раза не просто побочным эффектом API, но необходимым для повышения скорости? Есть ли хорошая альтернатива OpenSSL, которая использует AES-NI?

1 ответ

Есть ли способ включить AES-NI в интерфейсе AEC_cbc_encrypt()?

Нет. AES_encrypt это только программная реализация. Он никогда не будет использовать аппаратное ускорение.

Кроме того, проект OpenSSL говорит, что вы не используете AES_encrypt и друзья. Скорее, они говорят вам использовать EVP_encrypt и друзья.


Является ли требование EVP в 2 раза не просто побочным эффектом API, но необходимым для повышения скорости?

Трудно сказать, потому что я никогда не описывал это. Но какое это имеет значение? Если вам нужно сделать X, то у вас нет выбора в OpenSSL. Здесь X выполняет аутентифицированное шифрование с помощью интерфейсов EVP.


Есть ли хорошая альтернатива OpenSSL, которая использует AES-NI?

Сложно сказать. Может быть, вы могли бы сформулировать свои требования, а затем спросить об обмене программистами стека. Это место, чтобы задавать вопросы дизайна высокого уровня.

Другие вопросы по тегам