使用 FileSource 加密内容后无法删除文件
Can't delete file after encrypting content with FileSource
我正在尝试使用 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)fails.The我得到的输出是:
Error code is:32
这是一个ERROR_SHARING_VIOLATION
,意思是"The process cannot access the file because it is being used by another process."
我的问题是:如何在 Filesource
行之后关闭文件,以便能够删除之后的文件?对于经典的 ifstream
,它将是 file.close()
,但我如何使用 Crypto++ 做到这一点?
我不熟悉 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();
...
我正在尝试使用 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)fails.The我得到的输出是:
Error code is:32
这是一个ERROR_SHARING_VIOLATION
,意思是"The process cannot access the file because it is being used by another process."
我的问题是:如何在 Filesource
行之后关闭文件,以便能够删除之后的文件?对于经典的 ifstream
,它将是 file.close()
,但我如何使用 Crypto++ 做到这一点?
我不熟悉 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();
...