Crypto ++ RSAES类中的内存泄漏

时间:2017-01-23 02:36:32

标签: c++ windows visual-studio memory-leaks crypto++

我正在尝试学习如何使用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以查看正在发生的事情,但代码非常复杂,无法立即解决。

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

1 个答案:

答案 0 :(得分: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.

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

我相信你所看到的是微软几十年来的错误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并将删除B   在A的破坏。如果A的构造函数引用了一个   对象B,然后调用者保留B的所有权,不应该   消灭它直到A不再需要它。

  2.   
  3. Crypto ++在类级别是线程安全的。这意味着您可以在多线程应用程序中安全地使用Crypto ++,但您必须提供   多个线程访问公共Crypto ++对象时的同步。

  4.   

pEFpSS是指针,它们归其他人所有。他们被删除了两次,这导致了例外。

  

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

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

编辑 还会在用户列表和Windows Debug build memory leaks cleared上看到Commit 301437e693fe8bff。库从动态初始化转移到静态初始化,以避免Microsoft平台上的问题。在Windows上使用inti_seg访问静态初始化程序列表;和GCC的constructorinit_priority属性。

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