2009-05-22 80 views
1

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

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时也有同样的问题。关于是什么导致问题的任何想法?谢谢。

回答

6

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

更可能的是,我希望你的意思是,当你打电话给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; 
+0

感谢罗布......这是问题,它现在工作。我很感激帮助。 – 2009-05-22 16:29:15