【问题标题】:OpenSSL AES_cbc_encrypt vs EVP interfacesOpenSSL AES_cbc_encrypt 与 EVP 接口
【发布时间】: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


【解决方案1】:

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

没有。 AES_encrypt 是纯软件实现。它永远不会使用硬件加速。

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


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

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


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

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

【讨论】:

  • OpenSSL 项目说要使用 EVP 接口,这样切换算法会更容易,这对我来说并不感兴趣。与硬件加速的联系被提及得比较模糊,有一条评论建议(现在我知道不正确)可以在直接算法上手动启用它。
猜你喜欢
  • 2012-08-22
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2011-03-04
  • 2021-03-17
  • 2012-05-09
相关资源
最近更新 更多