OpenSSL AES_cbc_encrypt与EVP接口

时间:2015-07-14 17:29:33

标签: c encryption openssl aes libcrypto

我需要使用AES-CBC加密长期存在的网络数据流。我原以为我只会拨打EVP_EncryptInit_ex()一次并保存E VP_CIPHER_CTX以便后续拨打EVP_EncryptUpdate。然后在解密端做同样的事情。我发现的第一个问题是EVP_DecryptUpdate总是落后一块。例如,如果我加密32个字节,第一个解密更新将仅返回16,即使我知道它已解密所有32个字节。我想这意味着我需要在每EVP_DecryptFinal后调用EVP_DecryptUpdate,然后EVP_EncryptInit_ex()在下次更新之前重置iv。

第二个问题是我可能有1000多个这些流,并且我正在努力减少内存占用。 sizeof(EVP_CIPHER_CTX)只有168个字节,但是如果我查询1000次调用EVP_EncryptInit_ex()之前和之后的内存使用情况,它看起来每个上下文分配额外的412个字节(这是在第一次调用后的20K之上)

更正,我看到每个CTX有412个字节而不是168 + 412

AES_cbc_encrypt()界面看起来更符合我的需求。有一个固定的260字节AES_KEY结构,而且我需要自己维护16字节的IV。但是,根据我的理解,它不使用AES-NI英特尔硬件加速。 https://security.stackexchange.com/questions/35036/different-performance-of-openssl-speed-on-the-same-hardware-with-aes-256-evp-an有没有办法在AEC_cbc_encrypt()接口上启用AES-NI? EVP的2X内存要求不仅仅是API的副作用,而且是提高速度所必需的吗?有没有一个很好的替代OpenSSL使用AES-NI?

1 个答案:

答案 0 :(得分:0)

  

有没有办法在AEC_cbc_encrypt()界面上启用AES-NI?

没有。 AES_encrypt是一个仅限软件的实现。它永远不会使用硬件加速。

此外,OpenSSL项目告诉您不要使用AES_encrypt和朋友。相反,他们会告诉您使用EVP_encrypt和朋友。

  

EVP的2X内存要求不仅仅是API的副作用,而且是提高速度所必需的吗?

很难说,因为我从来没有说过它。但这有什么关系呢?如果你需要做X,那么你在OpenSSL中真的没有选择。在这里,X使用EVP接口执行认证加密

  

是否有使用AES-NI的OpenSSL的良好替代品?

很难说。也许你可以清楚表达你的要求,然后问Programmers Stack Exchange。这是提出高级别设计问题的地方。