Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi PGP auf Android und Windows (https://www.delphipraxis.net/204141-delphi-pgp-auf-android-und-windows.html)

Ghostwalker 28. Apr 2020 10:51

Delphi PGP auf Android und Windows
 
Servus,

ich bin gerade am tüfteln einer Android-App für Zeiterfassung. Die App erfasst als nur Zeiten, speichert diese in einer kleinen DB. Diese Daten sollen dann an ein Windowsprogramm übertragen werden um dort ausgewertet zu werden.

Nun dacht ich mir, das es ja eine gute Idee ist, solche Daten bei der Übertragung zu Verschlüsseln und wollte dafür das PGP-Verfahren nutzen.

Trotz intensiver Suche im Netz, bin ich aber auf lediglich 2 Libs gestoßen, die die Funktionalität bieten.

Zum einen ist das IPWorks OpenPGP (was aufgrund des Preises ausfällt) und Lockbox3.

Also hab ich mir mal Lockbox3 installiert und nach einigem rumgefriggel es auch geschafft Schlüsselpaare zu generieren. Soweit ich das verstanden habe, werden ja 2 Paare generiert (ein Satz fürs signieren und einer fürs Verschlüsseln). Aber leider find ich keine Möglichkeit auf die einzelnen Schlüsselteile zu zugreifen.

Weiß hier jemand Rat ?

oder gar eine andere Alternative ?

Gruß

Ghostwalker

EdAdvokat 28. Apr 2020 15:39

AW: Delphi PGP auf Android und Windows
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
falls RSA für Dich eine Alternative sein sollte (asymetrische Chiffrierung) kann ich Dir die exeples des cn-Pack empfehlen. http://www.cnpack.org/showdetail.php?id=864&lang=en
Ich habe dieses Beispiel, dass übrigens auch mit Unterstützung der Lockbox arbeitet aus dem Chinesischen "übersetzt" und erweitert. Es gibt eine Version FMX und eine VCL.
Es gestattet die chiffrierte Übermittlung von Daten durch Bereitstellung eines öffentlichen Schlüssels. Zum RSA-Verfahren gibt es div. Beschreibungen im Netz.
Ich füge mal das fertige Programm nur zur Ansicht bei. Falls Interesse besteht bitte melden.

Ghostwalker 28. Apr 2020 19:11

AW: Delphi PGP auf Android und Windows
 
Hmm...dein Demo sieht danach aus, als wenn es genau das macht was ich mir vorstelle (zumindest zum Teil).

Wie schon beschrieben, ist das Problem mit Lockbox3 einfach, das ich die generierten Schlüssel (und hier kommt ja RSA zum Einsatz) nicht seperat ansprechen kann. Generiert werden, lt. Entwickler von LB3, 4 Schlüssel (Jeweils Public und Private für Signing und für Encryption). Aber die Komponente lässt nur zu, das ganze in einem Stream zu speichern. Hier kann ich auch nur zwischen Nur Public, Nur Private oder beides wählen. Das ist aber, einfach ausgedrückt, ein bischen blöd, wenn man das ganze in seperate Felder eine DB schreiben will (Ja..geht auch per Blob, is aber eher suboptimal).

Wäre super, wenn du mir mal den Source des Demos per PN zukommen lassen könntest :)

EdAdvokat 28. Apr 2020 20:03

AW: Delphi PGP auf Android und Windows
 
Liste der Anhänge anzeigen (Anzahl: 1)
also die generierten Schlüssel in RSA kannst du abspeichern. Das war auch mein Problem.
Wichtig ist dass cn-pack und lockbox installiert sind, dann sollte es mit dem Programm auch klappen.
ggf. kann das Programm auch noch für Deine Zwecke erweitert werden. Ich habe das Ganze nur für mich aus Spaß an der Freunde programmiert, um zu sehen, wie es mit großen Zahlen tatsächlich funktioniert. Ja es funktioniert und ich habe es mit Freunden schon mal ausprobiert.

TurboMagic 28. Apr 2020 20:56

AW: Delphi PGP auf Android und Windows
 
Interessantes Thema.

Wäre es technisch möglich, unter Verwendung der RSA Uterstützung von Lockbox 3,
eine Delphi App zu schreiben die als Server für ein IoT Gerät im selben TCP/IP Netzwerk
dient?

Ghostwalker 29. Apr 2020 05:06

AW: Delphi PGP auf Android und Windows
 
@EdAdvokat

Danke schonmal. Werd mir das dann gleich mal reinziehen. :)

@Turbo

Sicherlich, das Prinzip ist ja im Endeffekt das gleiche, egal ob ich nun ein Smartphone oder ein anderes Gerät nutze. Die beiden Stellen müssen lediglich ihre Public Keys austauschen und schon kannst du die Übertragungen verschlüsseln.

Ghostwalker 29. Apr 2020 08:19

AW: Delphi PGP auf Android und Windows
 
So..laufen tuts schon mal grunsätzlich. Danke hier schonmal für die Hilfe.

Fazit:

Es werden wirklich 4 Keys erstellt. Jeweils Private und Public für Signing und Encryption/Decryption. Leider lassen sich nur Public und Private unterscheiden. Da ich das ganze in einer DB speichere, bin ich jetzt den Weg über Blob's in der DB gegangen.

Hier mal einige Codeschnippsel aus meinem Testprogramm. Ich benutz hier Lockbox3 (manuell installiert) sowie FireDAC mit einer SQLite-DB.

Generieren der Keys und Speichern in der DB:

Delphi-Quellcode:
var
  tmsPub  : TMemoryStream;
  tmsPriv : TMemoryStream;

begin
  memo1.Lines.Clear;
  if (Signatory1.GenerateKeys) then
  begin
    tmsPub := TMemoryStream.create;
    tmsPriv := TMemoryStream.create;
    Signatory1.StoreKeysToStream(tmsPub,[partPublic]);
    Signatory1.StoreKeysToStream(tmsPriv,[partPrivate]);
    (* Seek streams to 0 *)
    tmspub.Seek(0,soBeginning);
    tmsPriv.Seek(0,soBeginning);

    Memo1.Lines.Append('Writing to DB');
    fdquery.SQL.Text := 'INSERT INTO justkeys (jk_data) values (:blobdata)';
    fdquery.Params[0].DataType := ftBlob;
    fdquery.Params[0].AsStream := tmspub;
    fdquery.ExecSQL;
    fdquery.Params[0].AsStream := tmsPriv;
    fdquery.ExecSQL;
    memo1.Lines.Append('DONE !!');
  end;
end;
Und dann Laden und Verschlüsseln:

Delphi-Quellcode:
procedure TForm53.Button2Click(Sender: TObject);
var
  base64String  : String;
  InputStr      : String;
  OutputStr     : String;
  tmp           : TStream;
  PubKeys       : TMemoryStream;
  Privkeys      : TMemoryStream;

begin
  PubKeys := TMemoryStream.Create;
  PrivKeys := TMemoryStream.Create;
  Memo1.Lines.Append('Loading Keys from DB');
  fdquery.SQL.Text := 'SELECT jk_data FROM justkeys where jk_uid = 7';
  fdquery.Open;
  fdquery.first;
  tmp := fdquery.CreateBlobStream(fdquery.FieldByName('jk_data'),TBlobStreamMode.bmRead);
  PubKeys.LoadFromStream(tmp);
  tmp.Free;
  fdquery.Close;

  fdquery.SQL.Text := 'SELECT jk_data FROM justkeys where jk_uid = 8';
  fdquery.open;
  fdquery.First;
  tmp := fdquery.CreateBlobStream(fdquery.FieldByName('jk_data'),TBlobStreamMode.bmRead);
  PrivKeys.LoadFromStream(tmp);
  tmp.Free;
  fdquery.Close;
  Memo1.Lines.Append('Keys Loaded !');
  Pubkeys.Seek(0,soBeginning);
  Privkeys.Seek(0,soBeginning);
  Signatory1.LoadKeysFromStream(pubkeys,[partPublic]);
  Signatory1.LoadKeysFromStream(privkeys,[partPrivate]);
  InputStr := 'Das ist ein sehr schöner Text zum testen der verschlüsselung';
  codecRSA.EncryptString(InputStr,base64String,TEncoding.Unicode);
  memo1.Lines.Append('Encryption: ');
  memo1.Lines.Append('Plaintext: '+InputStr);
  memo1.Lines.Append('Encrypted (Base64)');
  memo1.Lines.Append(base64String);
  memo1.Lines.Append('');
  codecRSA.DecryptString(OutputStr,base64String,TEncoding.Unicode);
  memo1.Lines.Append('Decrypted:');
  memo1.Lines.Append(outputStr);
  Pubkeys.Free;
  privkeys.Free;
end;
Gruß Ghostwalker

TurboMagic 29. Apr 2020 21:44

AW: Delphi PGP auf Android und Windows
 
Zitat:

Zitat von Ghostwalker (Beitrag 1463086)
@EdAdvokat

Danke schonmal. Werd mir das dann gleich mal reinziehen. :)

@Turbo

Sicherlich, das Prinzip ist ja im Endeffekt das gleiche, egal ob ich nun ein Smartphone oder ein anderes Gerät nutze. Die beiden Stellen müssen lediglich ihre Public Keys austauschen und schon kannst du die Übertragungen verschlüsseln.

Danke für die Antwort. Ich hatte vergessen zu erwähnen, dass der Server eine Android App sein soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 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