我正在尝试学习如何使用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调试器进入StringSink
,PK_EncryptorFilter
和StringSource
以查看正在发生的事情,但代码非常复杂,无法立即解决。
知道如何解决这些内存泄漏问题吗?
答案 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 )));
上面代码后面的所有内容都是红鲱鱼。你因为微软不能解决他们的错误而陷入了困境。
是的,那不对。来自Readme.txt:好的,所以我做了最明显的事情并添加了这些:
delete pEF; delete pSS;
但它导致了未处理的异常
*重要使用说明*
如果A的构造函数接受指向对象B的指针(除了诸如int和char之类的基本类型),那么A拥有B并将删除B 在A的破坏。如果A的构造函数引用了一个 对象B,然后调用者保留B的所有权,不应该 消灭它直到A不再需要它。
- 醇>
Crypto ++在类级别是线程安全的。这意味着您可以在多线程应用程序中安全地使用Crypto ++,但您必须提供 多个线程访问公共Crypto ++对象时的同步。
pEF
和pSS
是指针,它们归其他人所有。他们被删除了两次,这导致了例外。
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的constructor
和init_priority
属性。
最好的努力&#34;使用静态初始化(如果可用)。否则,事情就会回归到动态初始化。在这里,&#34;静态初始化&#34;意味着将库放入CRT静态初始化列表中,该列表运行构造函数并调用全局对象ctors(而不是vanilla C ++静态对象)。