Delphi - MadCrypt - 加密和解密字符串时出现问题

时间:2009-05-22 14:34:50

标签: delphi encryption

我正在尝试加密字符串,但通常只有部分字符串被加密。我没有看到其他人遇到这个问题,所以我可能做错了什么。我在Delphi 2007和2009中遇到了同样的问题。我使用的是Win XP SP3。这是代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  sTestToConvert: ansistring;
  sPassword: ansistring;
begin
  sTestToConvert := trim(Memo1.Text);
  sPassword := trim(Edit1.Text);
  madCrypt.Encrypt(sTestToConvert, sPassword);
  Memo2.Text := sTestToConvert;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  sTextToConvert: ansistring;
  sPassword: ansistring;
begin
  sPassword := trim(Edit1.Text);
  sTextToConvert := trim(memo2.Text);
  madCrypt.Decrypt(sTextToConvert, sPassword);
  Memo1.Text := sTextToConvert;
end;

尝试使用OldEncrypt和OldDecrypt时也遇到了同样的问题。关于导致问题的原因是什么?感谢。

1 个答案:

答案 0 :(得分:6)

当你说“只有部分字符串被加密”时,我不确定你的意思。您的意思是,即使在致电sTestToConvert之后,您仍然可以在Encrypt中看到一些明文?

更有可能的是,我希望你的意思是当你打电话给Decrypt时,你只能获得原始字符串的一部分。

这是因为Encrypt可以在结果中存储任何字节值,包括非打印字符,甚至是#0,空字符。当您在TMemoTEdit中存储此类字符串时,基础Windows控件会将#0字符视为字符串的结尾。它不存储其余的加密值。因此,当您对编辑控件中存储的内容进行Decrypt调用时,您只会解密原始内容的一部分。

如果您想拥有加密数据的文字版本,请使用EncodeDecode功能; documentation online提到了这一点。那些使用base-64编码。

procedure TForm1.Button1Click(Sender: TObject);
var
  sTestToConvert: AnsiString;
  sPassword: AnsiString;
begin
  sTestToConvert := Trim(Memo1.Text);
  sPassword := Trim(Edit1.Text);
  madCrypt.Encrypt(sTestToConvert, sPassword);
  Memo2.Text := madCryt.Encode(sTestToConvert);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  sTextToConvert: AnsiString;
  sPassword: AnsiString;
begin
  sPassword := Trim(Edit1.Text);
  sTextToConvert := madCrypt.Decode(Memo2.Text);
  madCrypt.Decrypt(sTextToConvert, sPassword);
  Memo1.Text := sTextToConvert;
end;