我在我的 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/