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?
Сложно сказать. Может быть, вы могли бы сформулировать свои требования, а затем спросить об обмене программистами стека. Это место, чтобы задавать вопросы дизайна высокого уровня.