2009-05-22 6 views
1

J'essaie de crypter une chaîne mais souvent seule une partie de la chaîne est en cours de cryptage. Je ne vois personne d'autre ayant ce problème, donc je fais probablement quelque chose de mal. J'ai le même problème dans Delphi 2007 et 2009. J'utilise Win XP SP3. Voici le code:Delphi - MadCrypt - Problème de cryptage et de décryptage d'une chaîne

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; 

J'ai aussi le même problème en essayant d'utiliser OldEncrypt et OldDecrypt. Des idées sur ce qui cause le problème? Merci.

Répondre

6

Je ne suis pas sûr de ce que vous voulez dire quand vous dites "seulement une partie de la chaîne est cryptée." Voulez-vous dire que vous pouvez toujours voir du texte en clair dans sTestToConvert même après avoir appelé Encrypt?

Plus probablement, je suppose que vous voulez dire que lorsque vous appelez Decrypt, vous ne récupérez qu'une partie de la chaîne d'origine.

C'est parce que Encrypt peut stocker toute valeur octet dans le résultat, y compris les caractères non-impression, même #0, le caractère nul. Lorsque vous stockez une telle chaîne dans un TMemo ou TEdit, le contrôle Windows sous-jacent traite le caractère #0 comme la fin de la chaîne. Il ne stocke pas le reste de la valeur chiffrée. Ainsi, lorsque vous appelez Decrypt sur ce qui est stocké dans le contrôle d'édition, vous ne décryptez qu'une partie de ce que vous aviez à l'origine.

Si vous souhaitez disposer d'une version texte des données cryptées, utilisez les fonctions Encode et Decode; le documentation online mentionne ceci. Ceux-ci utilisent l'encodage en 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

Merci Rob ... c'était le problème et ça marche maintenant. J'apprécie l'aide. –

Questions connexes