Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
461 Beiträge
 
#23

AW: AnsiString speichern und laden

  Alt 14. Mär 2021, 20:50
@Willie1: Auch wenn du es nicht hören wolltest, Kryptografie ist mit den richtigen Units vernünftig umzusetzen. Nimm besser die folgenden Funktionen:
Delphi-Quellcode:
uses
  SynCommons, SynCrypto, SynZip;

const
  KEY_FILE_HEADER = 'TOPSECRET';
  KEY_FILE_HEADER_SIZE = Length(KEY_FILE_HEADER);

function SaveToFile(const pmcRaw, pmcPassword: RawByteString; const pmcFileName: TFileName): Boolean;
begin
  Result := False;
  if (pmcRaw <> '')
    and (pmcPassword <> '')
    and (DirectoryExists(ExtractFilePath(pmcFileName))) then
  begin
    Result := FileFromString(KEY_FILE_HEADER + SynCrypto.AESSHA256(SynZip.CompressString(pmcRaw), pmcPassword, True), pmcFileName);
  end;
end;

function LoadFromFile(const pmcFileName: TFileName; const pmcPassword: RawByteString; out pmcRaw: RawByteString): Boolean;
var
  sSrc, sOut: RawByteString;
begin
  Result := False;
  if (pmcPassword <> '')
    and FileExists(pmcFileName) then
  begin
    sSrc := StringFromFile(pmcFileName);
    if (sSrc <> '')
      and (PosEx(KEY_FILE_HEADER, sSrc, 1) = 1) then
    begin
      SetString(sOut, Nil, Length(sSrc) - KEY_FILE_HEADER_SIZE);
      SynCrypto.AESSHA256(PAnsiChar(sSrc) + KEY_FILE_HEADER_SIZE, Pointer(sOut), Length(sOut), pmcPassword, False);
      pmcRaw := SynZip.UnCompressString(sOut);
      Result := (pmcRaw <> '');
    end;
  end;
end;
Anwenden kannst du das wie folgt:
Delphi-Quellcode:
procedure TForm1.btnSaveClick(Sender: TObject);
begin
  if SaveToFile(StringToUTF8(memoTopSecret.Text), 'Willie1', ChangeFileExt(ParamStr(0), '.key')) then
    memoTopSecret.Clear;
end;

procedure TForm1.btnLoadClick(Sender: TObject);
var
  secStr: RawByteString;
begin
  if LoadFromFile(ChangeFileExt(ParamStr(0), '.key'), 'Willie1', secStr) then
    memoTopSecret.Text := UTF8ToString(secStr);
end;
Bis bald...
Thomas
  Mit Zitat antworten Zitat