我需要使用AES-CBC加密长寿命网络数据流。我想我只需要调用一次EVP_EncryptInit_ex(),然后保存EVP_CIPHER_CTX,以便以后调用EVP_EncryptUpdate。然后在解密端也这样做。我发现的第一个问题是EVP_DecryptUpdate总是落后一个块。例如,如果我加密32个字节,第一次解密更新将只返回16,即使我知道它已经解密了所有32个字节。我想这意味着我需要在每次EVP_DecryptFinal之后调用EVP_DecryptUpdate,然后在下次更新之前EVP_EncryptInit_ex()重置iv。
第二个问题是,我可能有1000多个这样的流,并试图减少内存占用。sizeof(EVP_CIPHER_CTX)只有168个字节,但是如果我在调用EVP_EncryptInit_ex()1000次之前和之后查询内存使用情况,它看起来会为每个上下文分配额外的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的副作用,而且是提高速度所必需的吗?有没有使用AES-NI的OpenSSL的好的替代品?

最佳答案

有没有办法在AEC_cbc_encrypt()接口上启用AES-NI?
不。AES_encrypt是一个软件专用的实现。它永远不会使用硬件加速。
另外,OpenSSL项目告诉您不要使用AES_encrypt和friends。相反,他们告诉你使用EVP_encrypt和朋友。
EVP的2X内存需求不仅是API的副作用,而且是提高速度所必需的吗?
很难说,因为我从来没有描述过。但这又有什么关系呢?如果需要做X,那么在OpenSSL中就没有选择。这里,X使用EVP接口执行经过身份验证的加密。
有没有使用AES-NI的OpenSSL的好的替代品?
很难说。也许你可以清楚地表达你的要求,然后问Programmers Stack Exchange。那是问高级设计问题的地方。

10-07 16:18