Einzelnen Beitrag anzeigen

Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Delphi PGP auf Android und Windows

  Alt 29. Apr 2020, 09:19
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
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat