2009-05-22 79 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