我需要使用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+412AES_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。那是问高级设计问题的地方。