使用FileSource加密内容后无法删除文件

时间:2017-08-06 08:44:51

标签: c++ windows encryption crypto++

我正在尝试使用AES EAX模式和CryptoPP库加密文件。 这是main()内容:

SecByteBlock key(AES::MAX_KEYLENGTH);
rnd.GenerateBlock(key, key.size());
ArraySource as(key.begin(), key.size(), true, new FileSink("key.bin"));

SecByteBlock iv(AES::BLOCKSIZE);
rnd.GenerateBlock(iv, AES::BLOCKSIZE);

EAX<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(key, key.size(), iv, iv.size());

FileSink file("image.jpg.enc");

ArraySource write_iv(iv, iv.size(), true, new Redirector(file));

FileSource write_ciphertext("image.jpg", true, new AuthenticatedEncryptionFilter(encryptor, new Redirector(file)));

const int delete_file = std::remove("image.jpg");
std::cout << delete_file << std::endl;
std::cout << "Error code is:" << GetLastError();

return 0;

加密部分成功结束,但是删除原始文件(image.jpg)失败。我得到的输出是:

Error code is:32

哪个是ERROR_SHARING_VIOLATION,这意味着“进程无法访问该文件,因为它正由另一个进程使用。” 我的问题是:如何在Filesource行之后关闭文件,以便能够删除文件?使用经典ifstream,它将是file.close(),但我怎么能用Crypto ++来做呢?

1 个答案:

答案 0 :(得分:2)

我不熟悉crypto++,但如果他们遵循RAII模式,那么触发~FileSource析构函数就足以关闭文件的句柄。

在C ++中,您将使用匿名范围来定义自动变量的生命周期。匿名范围是使用花括号定义的,没有任何关键字:

using namespace std;
...
encryptor.SetKeyWithIV(key, key.size(), iv, iv.size());

// begin an anonymous scope:
{

    FileSink    file             ( "image.jpg.enc" );
    ArraySource write_iv         ( iv, iv.size(), true, new Redirector( file ) );
    FileSource  write_ciphertext ( "image.jpg", true, new AuthenticatedEncryptionFilter( encryptor, new Redirector( file ) ) );        
}
// end the scope, causing all objects declared within to have their destructors called

const int delete_file = remove("image.jpg");
cout << delete_file << endl;
cout << "Error code is:" << GetLastError();
...

顺便说一句,我注意到你使用new而没有delete。我相信你也可以自动制作这些参数对象,如下所示:

using namespace std;
...
encryptor.SetKeyWithIV(key, key.size(), iv, iv.size());

// begin an anonymous scope:
{       
    FileSink                      file            ( "image.jpg.enc" );
    Redirector                    write_redir     ( file );
    ArraySource                   write_iv        ( iv, iv.size(), true, &write_redir );
    AuthenticatedEncryptionFilter filter          ( encryptor, &write_redir )
    FileSource                    write_ciphertext( "image.jpg", true, &filter );
}
// end the scope, causing all objects declared within to have their destructors called

const int delete_file = remove("image.jpg");
cout << delete_file << endl;
cout << "Error code is:" << GetLastError();
...