c++ - 使用 EVP_* 就地加密/解密

标签 c++ encryption openssl

我在我的 C++ 项目中使用 openssl 来加密和解密文本文件。正如此处已经指出的那样,我正在按照以下教程进行操作:https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption .我注意到在本教程中,单独的缓冲区用于纯文本和加密文本。由于数据可能占用大量内存并且算法是按 block 执行的,我想知道是否可以执行就地加密/解密,以便输出数据与输入数据放在同一缓冲区中,当它不再需要了?

最佳答案

这是一个笼统的回答,不仅仅针对 EVP_*。

对于某些实现是的,但加密和填充存在潜在问题。

对于加密,需要增加输入数据存储以接受填充,但这会改变输入数据,从而改变加密数据。在一些可以明确指定输入长度的实现中,这是可行的。

对于带填充的解密,数据大小会更小,这必须以某种方式处理,同样一些实现将允许实现这一点。

但是除非实现明确声明支持使用相同的数据空间,否则不建议这样做。它可能适用于某些输入但不适用于所有输入,并且如果将来更改实现内部结构可能会中断。

注意:我已经在一个实现(不是 EVP_*)上成功测试了这一点。

关于c++ - 使用 EVP_* 就地加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42440820/

相关文章:

android - 如何在 Android 中加密 session 值

c# - 无法从 VB.Net 验证 C++ 中的签名哈希

c# - 将代码从 C++ 包装到 C# 时的内存管理

c++ - C++和Lua之间的简单数学计算不同

windows - 用于在 Windows 上创建和提取受密码保护的 ZIP 文件的 7-Zip 命令?

c++ - 如何在 Windows 中使用 MinGW 构建 OpenSSL?

c - 错误 'struct ec_key_st' 类型的定义不完整,使用 OpenSSL

c++ - Direct2D 位图画笔拉长

c++ - boost::locale::to_lower 抛出 bad_cast 异常

java - 从 openssl ec 在 Java 中创建 PublicKey 时出现 InvalidKeyException