2016-03-01 57 views
1

我用下面的代碼來解密文件:加密++異常調用messageEnd

FileSource fe(fileUrl.c_str(), false, 
        new AuthenticatedDecryptionFilter(decryptor, new FileSink(
          std::string(fileUrl).c_str()), CryptoPP::AuthenticatedDecryptionFilter::THROW_EXCEPTION | CryptoPP::AuthenticatedDecryptionFilter::MAC_AT_END)); 

     size_t BLOCK_SIZE = 16384; 
    while (remaining && !fe.SourceExhausted()) { 
     const unsigned int req = STDMIN(remaining, BLOCK_SIZE); 
     fe.Pump(req); 
     fe.Flush(false); 

     remaining -= req; 
    } 
    fe.MessageEnd(); 

如果我嘗試這樣做沒有fe.MessageEnd(),我的解密文件是16個字節短。所以我想我需要調用MessageEnd()來解決這個問題。 但如果我叫MessageEnd()我得到Follwing異常:BufferedTransformation:此對象不允許輸入

回答

1

如果我叫MessageEnd()我得到Follwing例外:BufferedTransformation: this object doesn't allow input ...

正確。 FileSource是來源,並且該消息必須存在。您不能在來源上致電PutPut2以將其他數據添加到消息中。


我想你有兩個選擇來對信號進行更多的控制。

Source首先

呼叫Flush

const int opts = AuthenticatedDecryptionFilter::THROW_EXCEPTION | 
    AuthenticatedDecryptionFilter::MAC_AT_END; 

FileSource fe(fileUrl.c_str(), false, 
    new AuthenticatedDecryptionFilter(decryptor, new FileSink(
     std::string(fileUrl).c_str()), opts)); 

fe.Flush(true); 

另請參見Flush的評論在Filter::Flush的說明書中無。

藏匿的指針過濾器和調用它MessageEnd

const int opts = AuthenticatedDecryptionFilter::THROW_EXCEPTION | 
    AuthenticatedDecryptionFilter::MAC_AT_END; 
AuthenticatedDecryptionFilter* adf = NULL; 

FileSource fe(fileUrl.c_str(), false, 
    adf = new AuthenticatedDecryptionFilter(decryptor, new FileSink(
     std::string(fileUrl).c_str()), opts)); 
adf.MessageEnd(); 

這是一種不尋常的,所以我不知道你會遇到什麼副作用。

不要刪除指針。 FileSource將在結束大括號超出範圍時將其刪除。


...我的解密文件是16個字節的短...

在我看來,這是如果在Source呼籲Flush不爲你工作,你應該追求的問題。

還要記住...的AuthenticatedEncryptionFilter輸出爲2元組{ciphertext,mac},所以你得到的16個字節,因爲MAC的密文擴張。稍後,當您使用AuthenticatedDecryptionFilter時,mac驗證後將被刪除。所以恢復的文本應該與純文本大小相同,兩者都應該比密文小16個字節。

我不清楚的事情是,事情按預期工作,但你不知道它應該如何工作。或者你真的在某處丟失了16字節的恢復文本。

+0

我在末尾丟失了16個字節的明文。稍後我會研究你的選擇。 – Ben

+0

感謝您的回答,您使用fe.Flush(true)的第一個選項似乎工作正常。 – Ben