Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi AnsiString speichern und laden (https://www.delphipraxis.net/207283-ansistring-speichern-und-laden.html)

mytbo 14. Mär 2021 19:48

AW: AnsiString speichern und laden
 
Ich weis nicht, ob ich dir damit helfe, wenn ich mORMot ins Spiel bringe. Der Thread ist aber schon etwas länger und die Unit SynCommons enthält viele nützliche Funktionen für den Programmiereralltag. mORMot ist von D7 bis 10.4 verfügbar. Muss nicht installiert werden, es reicht, die Bibliothekspfade zu setzen. Den Download findest du hier. Es steht eine ausführliche Hilfe, viele Beispiele und ein freundliches Forum zur Verfügung.

Umgesetzt im Anfangsbeispiel:
Delphi-Quellcode:
uses
  SynCommons;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Txt = '' then Exit;
  SynCommons.FileFromString(Txt, Path);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Txt := SynCommons.StringFromFile(Path);
  Memo1.Text := UTF8ToString(Txt);
end;
Disclaimer: Ich weis schon, Kanonen auf Spatzen ... mORMot ist bei mir inzwischen in jedem Projekt und im Alltag inzwischen eine unverzichtbare Allzweckwaffe.

Bis bald...
Thomas

himitsu 14. Mär 2021 20:28

AW: AnsiString speichern und laden
 
Binärdaten in Strings waren noch nie eine super Idee.
Alternativen gibt es zu Genüge und wurden Einige genannt.

mytbo 14. Mär 2021 20:50

AW: AnsiString speichern und laden
 
@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

KodeZwerg 14. Mär 2021 20:52

AW: AnsiString speichern und laden
 
Damit er erstmal dennoch weiterkommt
ohne extras die delphi nicht besitzt
für das Experiment habe ich mal was getippst hier in Editor, in der Hoffnung das wichtigste zu zeigen.

Delphi-Quellcode:
uses System.NetEncoding, System.IniFiles;

function WilliEnc(const AValue: AnsiString): AnsiString;
var
  Nibble: AnsiString;
begin
  Nibble := AValue;
  // mach hier dein nibble ding


  // hier verpacken wir alles in ein Base64
  Nibble := TNetEncoding.Base64.Encode(Nibble);
  Exit(Nibble);
end;

function WilliDec(const AValue: AnsiString): AnsiString;
var
  Bytes: TBytes;
  Nibble: AnsiString;
begin
  // hier wird aus dem base64 wieder ein ansistring, und zwar nur ein ansistring (!)
  Bytes := TNetEncoding.Base64.DecodeStringToBytes(AValue);
  Nibble := TEncoding.ANSI.GetString(Bytes);
  // ab dieser stelle ist der geladene base64 kodierte inhalt wieder dein original ansistring
  // also mach ab hier dein nibble ding :-)


  Exit(Nibble);
end;

function LoadData: string;
var
  Ini: TIniFile;
begin
  Result := '';
  if FileExists('name.ini') then
    begin
      Ini := TIniFile.Create('name.ini');
      try
        Result := WilliDec(Ini.ReadString('Sektion', 'Ident', ''));
      finally
        Ini.Free;
      end;
    end;
end;

procedure SaveData(const AValue: string);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create('name.ini');
  try
    Ini.WriteString('Sektion', 'Ident', WilliEnc(AValue));
  finally
    Ini.Free;
  end;
end;



// exemplarische Anwendung

procedure TForm1.btnLoadClick(Sender: TObject);
begin
  Edit1.Text := LoadData;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
  SaveData(Edit1.Text);
end;
nicht getestet, nur getippt

...roter text beim speichern oh oh...


//edit
an Thomas: ich bin voll auf deiner seite!

Willie1 15. Mär 2021 10:27

AW: AnsiString speichern und laden
 
Hallo,
da brauche ich Zeit, um das alles bewerten zu können. Mit der Kryptographie stimmt natürlich, es gibt eine komplette AES-Verschlüsselung als Delphi-Unit von einem Uni-Mathematiker aus Kiel, muss mal sehen, ob ich das noch wiederfinde.
Mein Ansatz hat ja Fehler: zB. das Zeichen #255 und eine Zeichenkette = Linie wie ---- usw. würde es sofort offenbaren.
Ich werde eure Erklärung ernst nehmen und "nachdenken".
Willie.

KodeZwerg 15. Mär 2021 10:42

AW: AnsiString speichern und laden
 
Zitat:

Zitat von Willie1 (Beitrag 1485142)
Hallo,
da brauche ich Zeit, um das alles bewerten zu können. Mit der Kryptographie stimmt natürlich, es gibt eine komplette AES-Verschlüsselung als Delphi-Unit von einem Uni-Mathematiker aus Kiel, muss mal sehen, ob ich das noch wiederfinde.
Mein Ansatz hat ja Fehler: zB. das Zeichen #255 und eine Zeichenkette = Linie wie ---- usw. würde es sofort offenbaren.
Ich werde eure Erklärung ernst nehmen und "nachdenken".
Willie.

Hallo Willie,

wie Du bemerkst wollen Dir ja viele helfen, mein Vorschlag, öffne einen neuen Thread so das wir da uns mit Kryptographie beschäftigen können.
Es gibt tausende Möglichkeiten wie man etwas verschlüsseln könnte.
Enorm viel geht schon mit Delphi Bordmitteln, oft läuft es auf ein XOR hinaus.
Bitmanipulation muss natürlich sehr durchdacht sein.
Aber das wichtigste ist halt alles auf den richtigen Datentyp abzustimmen.

Nur nicht Kopf in den Sand stecken, zusammen packen wir das schon :-)

Willie1 16. Mär 2021 09:39

AW: AnsiString speichern und laden
 
Zitat:

Zitat von KodeZwerg (Beitrag 1485143)
mein Vorschlag, öffne einen neuen Thread so das wir da uns mit Kryptographie beschäftigen können.

KodeZwerg ich werde einen neuen Thread eröffnen. Willie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz