我需要使用 AES-CBC 加密长期存在的网络数据流。我在想我只会打EVP_EncryptInit_ex()
一次电话,然后保存 EVP_CIPHER_CTX
以供后续调用EVP_EncryptUpdate
. 然后在解密端做同样的事情。我发现的第一个问题是 EVP_DecryptUpdate 总是落后一个块。例如,如果我加密 32 个字节,第一次解密更新将只返回 16 个,即使我知道它已经解密了所有 32 个字节。我想这意味着我需要EVP_DecryptFinal
在 every 之后调用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 有没有办法启用 AES-NI在AEC_cbc_encrypt()
界面上?EVP 的 2 倍内存需求不仅是 API 的副作用,而且是提高速度所必需的吗?是否有使用 AES-NI 的 OpenSSL 的良好替代方案?