我需要使用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?
答案 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。这是提出高级别设计问题的地方。