2011-05-20 35 views
0

這是我第一次使用這個論壇,而且我是用純粹的絕望來做到這一點的。我應該寫一個利用Des algorythm的加密程序。我設法很好地編寫了Des代碼,並且它在內存中沒有任何錯誤。但是當我必須從文件中讀取密文並解密時,我的麻煩纔開始。它有時有效,而其他則不行。我嘗試了很多方法來解決這個問題,但沒有達到目的。這裏是沒有Des代碼本身的主代碼。請幫助我使用C++進行加密(錯誤讀取密文)

int main() 
{ 
    Des d1,d2; 
    char *str=new char[1000]; 
    char *str1=new char[1000]; 
    char c; 

    ifstream *keyFile; 
    ofstream cipherFile ; 

    keyFile= new ifstream; 
    keyFile->open ("key.txt", ifstream::binary) ; 
    binaryToHexa (keyFile); 
    cipherFile.open ("ciphertext.dat", ofstream::binary) ; 
    std::ifstream plainFile("plaintext.txt", ifstream::binary); 

    plainFile.seekg(0, std::ios::end); 
    std::ifstream::pos_type filesize = plainFile.tellg(); 
    plainFile.seekg(0, std::ios::beg); 

    std::vector<char> bytes(filesize); 

    plainFile.read(&bytes[0], filesize); 

    str = new char[bytes.size() + 1]; // +1 for the final 0 
    str[bytes.size() + 1] = '\0'; // terminate the string 
    for (size_t i = 0; i < bytes.size(); ++i) 
    { 
     str[i] = bytes[i]; 
    } 

    char *temp=new char[9]; 
    for(int i=0; i<filesize; i+=8) 
    { 
     for(int j=0; j<8; j++) 
     { 
      temp[j]=str[i+j]; 
     } 
     temp[8]='\0'; 
     str1=d1.Encrypt(temp); 
     cipherFile<<str1; 
     //cout<<d2.Decrypt(str1); 
    } 
    cipherFile.close(); 
    plainFile.close(); 

    std::ifstream cipherFileInput("ciphertext.dat", std::ios::binary); 

    cipherFileInput.seekg(0, std::ios::end); 
    std::ifstream::pos_type filesize2 = cipherFileInput.tellg(); 
    cipherFileInput.seekg(0, std::ios::beg); 

    std::vector<char> bytes2(filesize2); 

    char* res; 

    cipherFileInput.read(&bytes2[0], filesize2); 

    res = new char[bytes2.size() + 1]; // +1 for the final 0 
    res[bytes2.size() + 1] = '\0'; // terminate the string 
    for (size_t i = 0; i < bytes2.size(); ++i) 
    { 
     res[i] = bytes2[i]; 
    } 

    char *temp2=new char[9]; 
    for(int i=0; i<filesize2; i+=8) 
    { 
     for(int j=0; j<8; j++) 
     { 
      temp2[j]=res[i+j]; 
     } 
     temp2[8]='\0'; 
     str1=d2.Decrypt(temp2); 
     cout<<str1; 
    } 

    return 1; 
} 
+2

定義 「不工作」。它會崩潰嗎?它是否提供錯誤信息?它會產生錯誤的結果嗎?你有沒有嘗試用調試器來瀏覽你的程序,看看它出錯了? – 2011-05-20 15:36:14

+0

只是一個預感,因爲你沒有提供有關這個問題的信息,你的文件可能有控制字符,如回車,換行等,你沒有遇到你的內存測試。 – AJG85 2011-05-20 15:40:18

+2

你爲什麼用'new'分配東西? – 2011-05-20 15:40:25

回答

0

這可能不是您的問題,但您的程序中至少有兩個未定義的行爲。你寫一個字節超出分配strres

str = new char[bytes.size() + 1]; // +1 for the final 0 
    str[bytes.size() + 1] = '\0'; // terminate the string 
    ... 
    res = new char[bytes2.size() + 1]; // +1 for the final 0 
    res[bytes2.size() + 1] = '\0'; // terminate the string 

這些任務應該是:

str[bytes.size()] = 0; 

res[bytes2.size()] = 0; 
+0

感謝您的幫助,但這對輸出沒有任何影響。我仍然得到垃圾的字符。 – 2011-05-20 16:25:39

相關問題