2016-02-12 39 views
1

如何檢測解密失敗?我有以下的測試代碼:如何使用TurboPower Lockbox 3.5檢測解密失敗

procedure TForm1.Button1Click(Sender: TObject); 
var 
plainms, cipherms: TMemoryStream; 
tempstr: string; 

begin 
    plainms := TMemoryStream.Create; 
    cipherms := TMemoryStream.Create; 
    try 
    cipherms.LoadFromFile('rwcx.ini'); 
    Codec1.Password := '122rkdkdk'; 
    try 
    Codec1.DecryptStream(plainms, cipherms); 
    except on E: Exception do 
     showmessage(e.Message); 
    end; 
    plainms.Position := 0; 
    SetLength(tempstr, plainms.Size * 2); 
    BinToHex(plainms.Memory, PChar(tempstr), plainms.Size); 
    showmessage(tempstr); 
    finally 
    plainms.Free; 
    cipherms.Free; 
    end; 
end; 

文件「rwcx.ini」只是一個純文本文件,包含加密的數據。我使用帶有CBC的AES 256以及Lockbox 3.5版安裝了「GetIt」。我期望plainms內存流是空的,或者由於保證解密失敗而引發異常。相反,我得到了垃圾,沒有例外。

你如何檢測解密失敗?我必須能夠檢測到錯誤的密碼或損壞的輸入數據。我錯過了什麼?

回答

2

加密只是一個轉換,它本身沒有正確解密的概念。

一種方法是創建加密數據的HMAC並將其加密到加密數據上並對HMAC解密加密數據並比較HMAC。小心使用HMAC比較函數,該函數的匹配和不匹配值需要相同的時間。

+0

我當時希望情況並非如此。我在圖書館網頁上的某處閱讀「使檢測解密失敗變得容易」或者影響到某些事情。我認爲這意味着HMAC是內置的。我還在他的論壇上閱讀了作者在RSA論壇上的回覆,聲明「在try/except塊中封裝解密以檢測錯誤密鑰」我想這隻適用於RSA而不適用於AES 。我會按照你的建議實施我自己的HMAC。感謝您的快速回復。 – Mike

+0

注意:有時開發人員認爲檢查有效的奇偶校驗是一個解決方案,但它並不完全正確,並且向客戶端返回填充失敗可允許惡意客戶端在沒有密鑰的情況下獲取加密數據,請參閱padding oracle攻擊。此外,AED GCM具有內置身份驗證,但支持仍然很低。 – zaph

+0

看看[RNCryptor格式](https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md),這是一個很好的方案。 – zaph