Delphi - MadCrypt - Проблема шифрования и дешифрования строки - PullRequest
1 голос
/ 22 мая 2009

Я пытаюсь зашифровать строку, но часто шифруется только часть строки. Я не вижу никого другого с этой проблемой, поэтому я, вероятно, делаю что-то не так. У меня та же проблема в 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. Любые идеи о том, что вызывает проблему? Спасибо.

1 Ответ

6 голосов
/ 22 мая 2009

Я не уверен, что вы имеете в виду, когда говорите "шифруется только часть строки". Ты имеешь в виду, что некоторые тексты все еще можно увидеть в sTestToConvert даже после вызова Encrypt?

Скорее всего, я ожидаю, что вы имеете в виду, что когда вы звоните Decrypt, вы получаете обратно только часть исходной строки.

Это потому, что Encrypt может хранить любое байтовое значение в результате, включая непечатаемые символы, даже #0, нулевой символ. Когда вы храните такую ​​строку в TMemo или TEdit, базовый элемент управления Windows обрабатывает символ #0 как конец строки. Он не хранит остальную часть зашифрованного значения. Таким образом, когда вы вызываете Decrypt для того, что хранится в элементе управления редактирования, вы дешифруете только часть того, что у вас было изначально.

Если вы хотите иметь текстовую версию зашифрованных данных, используйте функции Encode и Decode; документация онлайн упоминает об этом. В них используется кодировка 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...