Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Text verschlüsseln Windows + Android (https://www.delphipraxis.net/203099-text-verschluesseln-windows-android.html)

gee21 13. Jan 2020 18:27

Text verschlüsseln Windows + Android
 
Guten Abend

ich habe mal vor längerem eine code im internet gefunden der text verschlüsselt und entschlüsselt. (Ist nicht von mir)
auf windows10 funktioniert der nach wie vor. aber in android (firemonkey) krieg ich das nicht zum laufen.

ich schaffe es zwar den text auf android korrekt zu verschlüsseln. habe bei gleichem text / gleichem schlüssel die gleichen chifre wie auch dem pc.
aber beim entschlüsseln funktioniert es mit android nicht. der ausgabetext ist einfach leer. :(

Weiss jemand was man machen muss damit dieser code auf beiden Plattformen funktioniert? (Windows / Android)
oder hat jemand einen einfacheren / besseren code als dieser?


Damit RawByteString in android funktioniert habe ich dieses packet installert. (evt liegt auch hier das problem?)
https://github.com/delphilite/System.ByteStrings

Delphi-Quellcode:
const CKEY1 = 53761;
CKEY2 = 32618;

function EncryptStr(const S :String; Key: Word): String;
var  i         :Integer;
      RStr      :RawByteString;
      RStrB     :TBytes Absolute RStr;
begin
  Result:= '';
  RStr:= UTF8Encode(S);
  for i := 0 to Length(RStr)-1 do begin
    RStrB[i] := RStrB[i] xor (Key shr 8);
    Key := (RStrB[i] + Key) * CKEY1 + CKEY2;
  end;
  for i := 0 to Length(RStr)-1 do begin
    Result:= Result + IntToHex(RStrB[i], 2);
  end;
end;

function DecryptStr(const S: String; Key: Word): String;
var  i, tmpKey :Integer;
      RStr      :RawByteString;
      RStrB     :TBytes Absolute RStr;
      tmpStr    :string;
begin
  tmpStr:= UpperCase(S);
  SetLength(RStr, Length(tmpStr) div 2);
  i:= 1;
  try
    while (i < Length(tmpStr)) do begin
      RStrB[i div 2]:= StrToInt('$' + tmpStr[i] + tmpStr[i+1]);
      Inc(i, 2);
    end;
  except
    Result:= '';
    Exit;
  end;
  for i := 0 to Length(RStr)-1 do begin
    tmpKey:= RStrB[i];
    RStrB[i] := RStrB[i] xor (Key shr 8);
    Key := (tmpKey + Key) * CKEY1 + CKEY2;
  end;
  Result:= UTF8Decode(RStr);
end;
ich öffne / speichere es dann so:
die showmessages() habe ich nur zum testen da drin.

Delphi-Quellcode:
procedure jetztverschlüsselnundseichern;
var
i: integer;
begin
 pwdb.Clear;

 for I := 0 to pwdb2.Count-1 do pwdb.Add( EncryptStr(pwdb2.Strings[i], 223));

 pwdb.SaveToFile(GetHomePath + '/pwdb.txt');
 showmessage('gespeichert und verschlüsselt');
 end;
Delphi-Quellcode:
 
  pwdb.loadfromfile(GetHomePath + '/pwdb.txt');
  pwdb2.Clear;
    for I := 0 to pwdb.Count-1 do begin
     s:= DecryptStr(pwdb.Strings[i], 223);
     showmessage('before:'+pwdb.Strings[i]+'  After:'+s);
     pwdb2.Add(s);
    end;
    showmessage('result nach entschlüsseln: '+ pwdb2.Text);

TurboMagic 13. Jan 2020 18:45

AW: Text verschlüsseln Windows + Android
 
Hallo,

schau' dir doch mal die DEC an, ist zwar offiziell noch Alpha Status,
funktioniert aber und das auch unter Android. Kommt mit ettlichen Unit
Tests so diass das Funktionieren auch einigermaßen abgesichert ist.

Außerdem sind inzwischen auch mehrere Demo Programme, für Konsole
und FMX basiert dabei. Die Hash und Verschlüsselungsdemos sind auch auf Google Play
als "DEC hash demo" und "DEC cipher demo" zu finden und die hash demo ist auch schon
in 64-bit kompatibler Fassung in Google Play.

Herunterladen kann man es hier und es enthält auch ein englisches PDF manual:

https://github.com/winkelsdorf/Delph...tionCompendium

gee21 13. Jan 2020 18:55

AW: Text verschlüsseln Windows + Android
 
Ohh vielen dank. ich werds mal versuchen... aber ich ziemlicher delphi noob ;)

Wie installier ich das? komponente installieren? oder die daten ins delphi verzeichniss kopieren?

Luckie 13. Jan 2020 21:52

AW: Text verschlüsseln Windows + Android
 
Liegt da keine Readme bei, in der das steht? Früher müsste man nur die Units ins Projekt einbinden. Die IDE muss sie also nur finden können.

philipp.hofmann 13. Jan 2020 21:52

AW: Text verschlüsseln Windows + Android
 
Ganz, ganz wichtiger Unterschied in der String-Nutzung zwischen Windows/MacOS und iOS/Android:
Bei iOS und Android gilt string[0..len-1] und bei Windows/MacOS string[1..len]!

Ganz unten an der Basis und dann so unterschiedlich, kann nicht sagen, warum dies so ist.

Code:
unit Crypt;

interface

uses SysUtils, FMX.Dialogs;

  function Encrypt (const s: String; Key: Word) : string;
  function Decrypt (const s: string; Key: Word) : string;

implementation

const CKEY1 = 53761;
      CKEY2 = 32618;

function Encrypt(const S :String; Key: Word): String;
var  i         :Integer;
      RStr      :RawByteString;
      RStrB     :TBytes Absolute RStr;
begin
  Result:= '';
  RStr:= UTF8Encode(S);
  for i := 0 to Length(RStr)-1 do begin
    RStrB[i] := RStrB[i] xor (Key shr 8);
    Key := (RStrB[i] + Key) * CKEY1 + CKEY2;
  end;
  for i := 0 to Length(RStr)-1 do begin
    Result:= Result + IntToHex(RStrB[i], 2);
  end;
end;

function Decrypt(const S: String; Key: Word): String;
var  i, tmpKey :Integer;
      RStr      :RawByteString;
      RStrB     :TBytes Absolute RStr;
      tmpStr    :String;
begin
  tmpStr:= UpperCase(S);
  SetLength(RStr, Length(tmpStr) div 2);
  i:=1;
  try
    while (i<Length(tmpStr)) do
    begin
      {$IF Defined(ANDROID) or Defined(IOS)}
        RStrB[i div 2]:= StrToInt('$' + tmpStr[i-1] + tmpStr[i]);
      {$ELSE}
        RStrB[i div 2]:= StrToInt('$' + tmpStr[i] + tmpStr[i+1]);
      {$ENDIF}
      Inc(i, 2);
    end;
  except
    Result:= '';
    Exit;
  end;
  for i := 0 to Length(RStr)-1 do
  begin
    tmpKey:= RStrB[i];
    RStrB[i] := RStrB[i] xor (Key shr 8);
    Key := (tmpKey + Key) * CKEY1 + CKEY2;
  end;
  Result:=UTF8ToString(RStr);
end;

end.

EdAdvokat 14. Jan 2020 13:32

AW: Text verschlüsseln Windows + Android
 
Schau doch mal bei den Beispielen vom cn-pack http://www.cnpack.org/index.php?lang=en vorbei. Dort findest Du Beispiele mit einer AES-Verschlüsselung
und auch ein Beispiel mit RSA sowohl für VCL als auch für FMX. DEC ist natürlich auch sehr gut.

TurboMagic 14. Jan 2020 20:46

AW: Text verschlüsseln Windows + Android
 
Zitat:

Zitat von Luckie (Beitrag 1455076)
Liegt da keine Readme bei, in der das steht? Früher müsste man nur die Units ins Projekt einbinden. Die IDE muss sie also nur finden können.

Im docs Ordner befindet sich eine mehrseitige englisch sprachige PDF Datei...
Und ja: die IDE muss die Units nur finden.

TurboMagic 14. Jan 2020 20:47

AW: Text verschlüsseln Windows + Android
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1455077)
Ganz, ganz wichtiger Unterschied in der String-Nutzung zwischen Windows/MacOS und iOS/Android:
Bei iOS und Android gilt string[0..len-1] und bei Windows/MacOS string[1..len]!

Ganz unten an der Basis und dann so unterschiedlich, kann nicht sagen, warum dies so ist.

EMBT meinte, dass die mehrzahl aller Programmiersprachen 0-basiert wäre und es durch diese Änderung
Einsteigern/Umsteigern leichter wäre. Darüber kann man sich jetzt streiten.

Luckie 14. Jan 2020 22:22

AW: Text verschlüsseln Windows + Android
 
Aber wäre es nicht auch interessant den Code für beide Plattformen zum Laufen zu bringen?

philipp.hofmann 14. Jan 2020 22:38

AW: Text verschlüsseln Windows + Android
 
Genau dies habe ich doch in meinem Kommentar getan. Dort steht der Code, der sowohl für Desktop als auch für Mobile läuft, indem ein {$IFDEF-Part hinzukam, der die Ungleichheit "angleicht".

Luckie 15. Jan 2020 00:38

AW: Text verschlüsseln Windows + Android
 
Dann habe ich das überlesen.

DeddyH 15. Jan 2020 06:34

AW: Text verschlüsseln Windows + Android
 
Könnte man nicht auch auf High(String) und Low(String) zurückgreifen, das würde die Compilerdirektiven sparen?

philipp.hofmann 15. Jan 2020 08:50

AW: Text verschlüsseln Windows + Android
 
Also ich verstehe die Funktion von low und high anders. Aber kann man ja einfach ausprobieren.

DeddyH 15. Jan 2020 10:03

AW: Text verschlüsseln Windows + Android
 
Bei mir gibt (unter Windows) Low('Hallo') 1 und High('Hallo') 5 aus, das passt also schon einmal. FMX auf mobilen Plattformen muss aber jemand anderes ausprobieren, ich benutze das schon lange nicht mehr.

Rollo62 15. Jan 2020 17:33

AW: Text verschlüsseln Windows + Android
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1455180)
Also ich verstehe die Funktion von low und high anders. Aber kann man ja einfach ausprobieren.

Keine Sorge, ist genau dafür gemacht.
http://docwiki.embarcadero.com/RADSt...ex_of_a_String

philipp.hofmann 15. Jan 2020 18:36

AW: Text verschlüsseln Windows + Android
 
Ok, dann lautet der vereinfachte Code folgendermaßen:

Delphi-Quellcode:
unit Crypt;

interface

uses SysUtils;

  function Encrypt (const s: String; Key: Word) : string;
  function Decrypt (const s: string; Key: Word) : string;

implementation

const CKEY1 = 53761;
      CKEY2 = 32618;

function Encrypt(const S :String; Key: Word): String;
var  i         :Integer;
      RStr      :RawByteString;
      RStrB     :TBytes Absolute RStr;
begin
  Result:= '';
  RStr:= UTF8Encode(S);
  for i := 0 to Length(RStr)-1 do begin
    RStrB[i] := RStrB[i] xor (Key shr 8);
    Key := (RStrB[i] + Key) * CKEY1 + CKEY2;
  end;
  for i := 0 to Length(RStr)-1 do begin
    Result:= Result + IntToHex(RStrB[i], 2);
  end;
end;

function Decrypt(const S: String; Key: Word): String;
var  i, tmpKey :Integer;
      RStr      :RawByteString;
      RStrB     :TBytes Absolute RStr;
      tmpStr    :String;
begin
  tmpStr:= UpperCase(S);
  SetLength(RStr, Length(tmpStr) div 2);
  i:=low(tmpStr);
  try
    while (i<=high(tmpStr)) do
    begin
      RStrB[i div 2]:= StrToInt('$' + tmpStr[i] + tmpStr[i+1]);
      Inc(i, 2);
    end;
  except
    Result:= '';
    Exit;
  end;
  for i := 0 to Length(RStr)-1 do
  begin
    tmpKey:= RStrB[i];
    RStrB[i] := RStrB[i] xor (Key shr 8);
    Key := (tmpKey + Key) * CKEY1 + CKEY2;
  end;
  Result:=UTF8ToString(RStr);
end;

end.

Luckie 15. Jan 2020 18:43

AW: Text verschlüsseln Windows + Android
 
Und der Code funktioniert?

Dir ist aber dass xor keine starke Verschlüsselung ist? Fpr jemand, der ernsthaft an die Daten gelangen will, ist das keine Hürde.

philipp.hofmann 15. Jan 2020 19:19

AW: Text verschlüsseln Windows + Android
 
Der Code funktioniert, j. Das dies keine starke Verschlüsselung ist, sollte klar sein, es ging aber zunächst ja einmal darum die vorhandene Implementierung des TE zu fixen. Für stärkere Verschlüsselungen sind hier auch Beispiele genannt worden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.

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