【发布时间】:2015-10-03 11:49:17
【问题描述】:
我需要使用 AES-CBC 加密长期存在的网络数据流。我在想我会打电话给EVP_EncryptInit_ex() 一次,然后保存 EVP_CIPHER_CTX 以便后续调用EVP_EncryptUpdate。然后在解密端做同样的事情。我发现的第一个问题是 EVP_DecryptUpdate 总是落后一个块。例如,如果我加密 32 个字节,第一次解密更新将只返回 16,即使我知道它已经解密了所有 32 个字节。我想这意味着我需要在每个EVP_DecryptUpdate 之后调用EVP_DecryptFinal,然后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 的副作用,而且是提高速度所必需的吗?有没有使用 AES-NI 的 OpenSSL 的良好替代方案?
【问题讨论】:
-
奇怪的是,我花了最后几个小时试图回答自己同样的问题。到目前为止,我倾向于 aes.h,evp.h 更通用,如果您计划将来支持不同的加密算法会更好。就我而言,这无关紧要,我对它的内存管理感到尴尬
-
我同意,但我想使用 AES-NI。我多年来一直在使用 Brian Gladman 源,并且看到它现在支持 AES-NI。他面向 Windows 构建环境,但我让 aes_ni.c 在 Linux 上构建和运行没有太多努力。每个键都有固定的 256 字节上下文。不幸的是,我不知道如何在我喜欢进行开发的 OS X 上进行构建。
-
“我需要加密长期存在的网络数据流...” - 根据定义,网络数据不会长期存在。它是有约束的,它有一个有限的生命周期。持久存储中的数据不受约束,并且具有无限的生命周期。 (这就是网络数据包和文件系统文件之间的真正区别)。
-
“长期存在”是指加密过程相对于文件的一次性加密来说是长期存在的。
标签: c encryption openssl aes libcrypto