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內存流是空的,或者由於保證解密失敗而引發異常。相反,我得到了垃圾,沒有例外。
你如何檢測解密失敗?我必須能夠檢測到錯誤的密碼或損壞的輸入數據。我錯過了什麼?
我當時希望情況並非如此。我在圖書館網頁上的某處閱讀「使檢測解密失敗變得容易」或者影響到某些事情。我認爲這意味着HMAC是內置的。我還在他的論壇上閱讀了作者在RSA論壇上的回覆,聲明「在try/except塊中封裝解密以檢測錯誤密鑰」我想這隻適用於RSA而不適用於AES 。我會按照你的建議實施我自己的HMAC。感謝您的快速回復。 – Mike
注意:有時開發人員認爲檢查有效的奇偶校驗是一個解決方案,但它並不完全正確,並且向客戶端返回填充失敗可允許惡意客戶端在沒有密鑰的情況下獲取加密數據,請參閱padding oracle攻擊。此外,AED GCM具有內置身份驗證,但支持仍然很低。 – zaph
看看[RNCryptor格式](https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md),這是一個很好的方案。 – zaph