代码之家  ›  专栏  ›  技术社区  ›  EinderJam

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

  •  1
  • EinderJam  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  2
  •   Dai    8 年前

    我不熟悉 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();
    ...
    
    推荐文章