您如何检测解密失败?我有以下测试代码:
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和安装有“ GetIt”的Lockbox 3.5版。我希望原语存储流为空,或者由于解密肯定会失败而引发异常。取而代之的是,我在原谅中得到了垃圾,也不例外。
您如何检测解密失败?我必须能够检测到错误的密码或损坏的输入数据。我想念什么?
最佳答案
加密只是一种转换,它本身没有正确解密的概念。
一种方法是创建加密数据的HMAC并将其添加到加密数据中,然后在解密HMAC时将加密数据进行比较并比较HMAC。小心使用HMAC比较功能,该功能花费相同的时间来匹配和不匹配值。