我正在尝试加密字符串,但通常只有部分字符串被加密。我没有看到其他人遇到这个问题,所以我可能做错了什么。我在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时也遇到了同样的问题。关于导致问题的原因是什么?感谢。
答案 0 :(得分:6)
当你说“只有部分字符串被加密”时,我不确定你的意思。您的意思是,即使在致电sTestToConvert
之后,您仍然可以在Encrypt
中看到一些明文?
更有可能的是,我希望你的意思是当你打电话给Decrypt
时,你只能获得原始字符串的一部分。
这是因为Encrypt
可以在结果中存储任何字节值,包括非打印字符,甚至是#0
,空字符。当您在TMemo
或TEdit
中存储此类字符串时,基础Windows控件会将#0
字符视为字符串的结尾。它不存储其余的加密值。因此,当您对编辑控件中存储的内容进行Decrypt
调用时,您只会解密原始内容的一部分。
如果您想拥有加密数据的文字版本,请使用Encode
和Decode
功能; 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;