2012-06-18 54 views
1

我正在使用crypto ++庫編寫應用程序。對於那些不熟悉它的人,ECB_Mode模板類繼承自CipherModeBase。該程序編譯並運行,但我得到的輸出是不正確的。當我從cipher_object調用加密方法時,它不會像直接使用ECB_Mode對象那樣工作。我已驗證選項對象實例變量正在正確分配。我想在if_then_else結構或switch_case中創建實例,這樣我就可以保持代碼的良好和乾爽。我究竟做錯了什麼?根據用戶輸入從模板創建對象

這裏是我努力但不工作:

CipherModeBase *cipher_object; 
    cipher_object == NULL; 

    if(options->cipher == BS_AES) 
    { 
     ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen); 
     cipher_object = &ecbEncryption; 
    } 
    else if(options->cipher == BS_TWOFISH) 
    { 
     ECB_Mode<Twofish >::Encryption ecbEncryption(options->key, options->keylen); 
     cipher_object = &ecbEncryption;  
    } 
cipher_object->processData(args); 

這裏是沒有問題:

ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen); 
ecbEncryption.processData(args); 

PS。我知道不使用ECB模式。我只是不想混淆四,直到我可以讓一切工作。我對C++也比較缺乏經驗。

回答

1

這裏:

cipher_object == NULL; 

if(options->cipher == BS_AES) 
{ 
    // v 
    ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen); 
    cipher_object = &ecbEncryption; 
} 

ecbEncryption是局部的範圍。您正在存儲本地地址,並在超出範圍後使用它。這是未定義的行爲。您應該使用新關鍵字在堆上分配它:

if(options->cipher == BS_AES) 
{ 
    cipher_object = new ECB_Mode<AES >::Encryption(options->key, options->keylen); 
} 

您應該對其他if語句執行相同的操作。

還要注意的是這樣的:

cipher_object == NULL; 

應改爲這樣:

cipher_object = NULL; 

的問題應該用上面的代碼來解決,雖然。

+0

謝謝!有效。比較運算符的好處,也許是休息一下的時間... – user1456786

+0

您還需要記住在完成使用後「刪除cipher_object」。 –

2

您的ecbEncryption對象在if和else範圍內的堆棧中聲明。 (範圍是用大括號括起來的東西)。

一個對象將在其聲明的範圍退出時被銷燬。所以,你調用processData的對象在你調用該方法之前已經被刪除了。很明顯,這是行不通的。

一種選擇是你可以聲明堆上的對象而不是堆棧。這樣,一生就可以按照你想要的方式進行控制。

嘗試使用std :: unique_ptr作爲cipher_object而不是原始指針。然後,在if和else子句分配給它喜歡:

cipher_object.reset(new ECB_Mode<AES>::Encryption(options->key, options->keylen)); 

然後對象將保持在堆中,直到cipher_object的範圍的結束,此時的unique_ptr將刪除它。而且,cipher_object的作用域將持續到您調用其上的任何方法之後。