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

C H*_*mon 1 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;
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*edy 6

当你说"只有部分字符串被加密"时,我不确定你的意思.你的意思是说你sTestToConvert打电话后仍然可以看到一些明文Encrypt吗?

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

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

如果您想要加密数据的文本版本,请使用EncodeDecode函数; 在在线文档提到了这一点.那些使用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;
Run Code Online (Sandbox Code Playgroud)