您如何检测解密失败?我有以下测试代码:

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比较功能,该功能花费相同的时间来匹配和不匹配值。

10-05 22:15