2

我需要使用 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 的良好替代方案?

4

1 回答 1

0

有没有办法在 AEC_cbc_encrypt() 接口上启用 AES-NI?

AES_encrypt,是仅软件实现。它永远不会使用硬件加速。

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


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

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


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

很难说。也许您可以阐明您的要求,然后在Programmers Stack Exchange上提问。那是提出高级设计问题的地方。

于 2015-07-14T22:11:16.227 回答