Crypto ++ RSAES类中的内存泄漏

问题描述 投票:4回答:1

我正在努力学习如何使用Crypto++课程。我的目标是为RSA加密生成公钥和私钥,然后对明文进行基本加密和解密。

所以我采用他们的例子from here - “使用过滤器的RSA加密方案(OAEP和SHA)”,稍作修改以便于阅读:

这部分工作正常:

CryptoPP::AutoSeededRandomPool rng;

//Generate Parameters
CryptoPP::InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 3072);

//Create Keys
CryptoPP::RSA::PrivateKey privateKey(params);
CryptoPP::RSA::PublicKey publicKey(params);

std::string plain="Hello world!", cipher, recovered;

//Encryption
CryptoPP::RSAES_OAEP_SHA_Encryptor e(publicKey);

但是当我称之为块时:

CryptoPP::StringSink* pSS = new CryptoPP::StringSink( cipher );
CryptoPP::PK_EncryptorFilter* pEF = new CryptoPP::PK_EncryptorFilter( rng, e, pSS);

CryptoPP::StringSource ss1( plain, true, pEF);

它会导致内存泄漏。我在Visual Studio输出窗口中得到以下内容:

Detected memory leaks!
Dumping objects ->
{24781} normal block at 0x029BCFF8, 28 bytes long.
 Data: <class CryptoPP::> 63 6C 61 73 73 20 43 72 79 70 74 6F 50 50 3A 3A 
{24780} normal block at 0x029BCFB0, 8 bytes long.
 Data: <        > F8 CF 9B 02 00 00 00 00 
Object dump complete.

好的,所以我做了最明显的事情并添加了这些:

delete pEF;
delete pSS;

但是它导致了一个未处理的异常,所以我假设Crypto ++类中的一个析构函数负责删除其中的一些对象。

所以问题是 - 这个泄漏来自哪里?

我尝试使用Visual Studio调试器踩到StringSinkPK_EncryptorFilterStringSource以查看发生了什么,但代码很复杂,可以立即解决。

知道如何解决这些内存泄漏问题吗?

c++ windows visual-studio memory-leaks crypto++
1个回答
1
投票

它会导致内存泄漏。我在Visual Studio输出窗口中得到以下内容:

Detected memory leaks!
Dumping objects ->
{24781} normal block at 0x029BCFF8, 28 bytes long.
 Data: <class CryptoPP::> 63 6C 61 73 73 20 43 72 79 70 74 6F 50 50 3A 3A 
{24780} normal block at 0x029BCFB0, 8 bytes long.
 Data: <        > F8 CF 9B 02 00 00 00 00 
Object dump complete.

你使用的代码看起来有点不寻常,但我相信它很好。

我相信你所看到的是微软几十年前的bug typeinfo.name() memory leaks。它自VC 5.0或VC 6.0天以来一直存在。


CryptoPP::StringSink* pSS = new CryptoPP::StringSink( cipher );
CryptoPP::PK_EncryptorFilter* pEF = new CryptoPP::PK_EncryptorFilter( rng, e, pSS);

CryptoPP::StringSource ss1( plain, true, pEF);

以下是管道通常的样子:

CryptoPP::StringSource ss( plain, true,
    new CryptoPP::PK_EncryptorFilter( rng, e,
        new CryptoPP::StringSink( cipher )));

遵循上面代码的所有内容都是红鲱鱼。你因为微软不会修复它们的漏洞而陷入了困境。


好的,所以我做了最明显的事情并添加了这些:

delete pEF;
delete pSS;

但它造成了一个未处理的例外

是的,那不对。来自Readme.txt

*重要使用说明*

  1. 如果A的构造函数接受指向对象B的指针(除了诸如int和char之类的基本类型),则A拥有B并将在A的销毁时删除B.如果A的构造函数接受对象B的引用,则调用者保留B的所有权,并且在A不再需要它之前不应销毁它。
  2. Crypto ++在类级别是线程安全的。这意味着您可以在多线程应用程序中安全地使用Crypto ++,但是当多个线程访问公共Crypto ++对象时,您必须提供同步。

pEFpSS是指针,他们是别人拥有的。他们被删除了两次,这导致了异常。


Crypto ++ RSAES类中的内存泄漏...

如果您运行cryptest.exe程序,那么您将看到报告的60或80个泄漏。我试图找到一个解决这个bug的解决方案大约10年或15年。最近是Stack Overflow上的How to remediate Microsoft typeinfo.name() memory leaks?

编辑还会看到用户列表中的Windows Debug build memory leaks clearedCommit 301437e693fe8bff。库从动态初始化转移到静态初始化,以避免Microsoft平台上的问题。在Windows上使用inti_seg访问静态初始化列表;和constructorinit_priority属于海湾合作委员会。

如果可用,它是使用静态初始化的“尽力而为”。否则,事情就会回归到动态初始化。这里,“静态初始化”意味着将库放入CRT静态初始化列表中,该列表运行构造函数并调用全局对象ctors(而不是vanilla C ++静态对象)。

© www.soinside.com 2019 - 2024. All rights reserved.