2012-12-09 105 views
1

我有一個加密和解密文件的代碼,代碼效果很好,但問題是當我嘗試使用不正確的密碼解密文件時,一個錯誤,執行解密導致與原始文件不同的文件。是否可以檢查在解密中輸入的密碼是否與加密中使用的密碼相同?如何檢查輸入的密碼是否在botan加密中是否正確

void AES::Encrypt(SymmetricKey key, InitializationVector iv, string inFilename, string outFilename) 
{ 
    ifstream in(inFilename.c_str(),std::ios::binary); 
    ofstream out(outFilename.c_str(),std::ios::binary); 

    QFile* file = new QFile(inFilename.c_str()); 

    qint64 size = file->size(); 
    qint64 i = 0; 
    percent = -1; 

    Pipe pipe(get_cipher("AES-256/CBC", key, iv,ENCRYPTION),new DataSink_Stream(out)); 
    pipe.start_msg(); 
    SecureBuffer<byte, 4096> buffer; 
    while(in.good()) 
    { 
     in.read((char*)&buffer[0], buffer.size()); 
     const size_t got_from_infile = in.gcount(); 
     pipe.write(buffer, got_from_infile); 
     i += got_from_infile; 
     int p = ((i * 100)/size); 
     if (p != percent) 
     { 
      percent = p; 
      emit progress(percent); 
     } 
     if(in.eof()) pipe.end_msg(); 
     while(pipe.remaining() > 0) 
     { 
      const size_t buffered = pipe.read(buffer, buffer.size()); 
      out.write((const char*)&buffer[0], buffered); 
     } 
    } 
    out.flush(); 
    out.close(); 
    in.close(); 

    qDebug() << "Encrypted!"; 
} 

void AES::Decrypt(SymmetricKey key, InitializationVector iv, string inFilename, string outFilename) 
{ 
    ifstream in(inFilename.c_str(),std::ios::binary); 
    ofstream out(outFilename.c_str(),std::ios::binary); 

    QFile* file = new QFile(inFilename.c_str()); 

    qint64 size = file->size(); 
    qint64 i = 0; 
    percent = -1; 

    Pipe pipe(get_cipher("AES-256/CBC", key, iv,DECRYPTION),new DataSink_Stream(out)); 
    pipe.start_msg(); 
    SecureBuffer<byte, 4096> buffer; 
    while(in.good()) 
    { 
     in.read((char*)&buffer[0], buffer.size()); 
     const size_t got_from_infile = in.gcount(); 
     pipe.write(buffer, got_from_infile); 
     i += got_from_infile; 
     int p = ((i * 100)/size); 
     if (p != percent) 
     { 
      percent = p; 
      emit progress(percent); 
     } 
     if(in.eof()) pipe.end_msg(); 
     while(pipe.remaining() > 0) 
     { 
      const size_t buffered = pipe.read(buffer, buffer.size()); 
      out.write((const char*)&buffer[0], buffered); 
     } 
    } 
    out.flush(); 
    out.close(); 
    in.close(); 

    qDebug() << "Decrypted!"; 
} 
+0

在加密之前添加一個散列,然後在解密後檢查它。 – buc

+0

密碼散列或文件散列? – user1576869

+0

該文件的散列會更好。 – buc

回答

0

加密時,首先將未加密文件的全部內容的散列附加到其末尾,然後加密新文件。因此加密文件比未加密文件大幾個字節。

解密後,首先檢查最後的散列是否有效,然後將其從文件中除去以獲取原始內容。

+0

我之前想過要問我的問題,如果沒有其他辦法,我會這樣做,謝謝。 – user1576869

相關問題