Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Buffer ver-/entschlüsseln mit RCx (https://www.delphipraxis.net/95324-buffer-ver-entschluesseln-mit-rcx.html)

Sko 5. Jul 2007 09:53


Buffer ver-/entschlüsseln mit RCx
 
Hallo,

ich habe hier eine Socket-Komponente welche mir erlaubt Daten vor dem Senden zu verschlüsseln und nach dem Empfangen zu entschlüsseln TNBFPA. Dafür gibt es die Ereignisse OnEncryptData und OnDecryptData. In diesen Ereignissen möchte ich jetzt die zu sendenden Daten verschlüsseln, dafür hab ich hagens RCx-Unit verwendet, allerdings kommt beim entschlüsseln nicht das raus was beim verschlüsseln rein kommt. So sehen die Ereignisse jetzt aus:
Delphi-Quellcode:
procedure TMainForm.ClientEncryptData(Sender: TObject; PA: TProtocolAdapter;
  var Buffer; const Size: Integer);
var
  ARCx: TRCxContext;
begin
  RCxInit(ARCx,'<Passwort>');
  RCxEncode(ARCx,Buffer,Buffer,Size);
  RCxDone(ARCx);
end;

procedure TMainForm.ClientDecryptData(Sender: TObject; PA: TProtocolAdapter;
  var Buffer; const Size: Integer);
var
  ARCx: TRCxContext;
begin
  RCxInit(ARCx,'<Passwort>');
  RCxDecode(ARCx,Buffer,Buffer,Size);
  RCxDone(ARCx);
end;
Hab ich da nen Fehler drin?

negaH 5. Jul 2007 10:12

Re: Buffer ver-/entschlüsseln mit RCx
 
Das sieht gut aus und müsste funktionieren.

Die Vermutung liegt nahe das deine TCP/IP Komponente die Daten die übertragen werden nicht als binäre Daten akzeptiert. Benutze mal

Delphi-Quellcode:
procedure TMainForm.ClientEncryptData(Sender: TObject; PA: TProtocolAdapter; var Buffer; const Size: Integer);
var
  ARCx: TRCxContext;
begin
  RCxInit(ARCx,'<Passwort>');
  RCxEncode(ARCx,Buffer,Buffer,Size);
  RCxDone(ARCx);

  ShowMessage( TFormat_HEX.Encode(Buffer, Size) );
end;

procedure TMainForm.ClientDecryptData(Sender: TObject; PA: TProtocolAdapter; var Buffer; const Size: Integer);
var
  ARCx: TRCxContext;
begin
  ShowMessage( TFormat_HEX.Encode(Buffer, Size) );

  RCxInit(ARCx,'<Passwort>');
  RCxDecode(ARCx,Buffer,Buffer,Size);
  RCxDone(ARCx);
end;
Um die Daten im Buffer nach der Ver-schlüsselung mit denen VOR der Ent-Schlüsselung zu vergleichen. Wir testen also ob deine TCP/IP Komponenten die Daten NICHT verändert.

Wird nämlich der Buffer intern durch die Komponete als zb. LongString verwaltet dann kann eine #0 im Buffer diesen Datenstring verkürzen. Oder irgend ein anderer Formatierer konvertiert die daten so das alle x Zeichen ein Zeilenumbruch eingefügt wird, auch die verändert die Daten. Solche Datenveräderungen führen dazu das die Entschlüsselung fehlschlägt und ist bisher die häufigste Ursache für Supportanfragen an mich gewesen.

Gruß Hagen

Sko 5. Jul 2007 10:23

Re: Buffer ver-/entschlüsseln mit RCx
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm, das passt wirklich nicht zusammen (siehe Anhang)
[EDIT] OK, ich glaub ich weis woran´s liegt, der Client empfängt manchmal 2 Nachrichtensequenzen gleichzeitig, dann stimmts natürlich nicht mehr, mal sehen wie ich das hinbekomme.
Beispiel:
Server sendet 1B4BA8037D0EF2119A8E9FE15BF94E2B3EEBB6EA und 53E3DD9B62D668F41801ED0B8C336B98AECB77542B0D0720D8 358D96D14C
Client empfängt 1B4BA8037D0EF2119A8E9FE15BF94E2B3EEBB6EA53E3DD9B62D668F41801ED0B8C336B98AECB77542B0D0720D8 358D96D14C

Muetze1 5. Jul 2007 11:05

Re: Buffer ver-/entschlüsseln mit RCx
 
Ja und? Die Trennung der Datenpackete ist Aufgabe des Protokolls, die Sockets haben nur die Aufgabe die Daten zu übertragen. Auch wenn du es als einzelne Teile versendest können sie mehr oder auch weniger unterteilt wieder rauskommen beim Empfänger. Die Socket übertragen nur Bytes, die kennen keine Trennung und machen auch nichts in der Richtung. Du musst für dich ein Protokoll vereinbaren mit dem du die Datenpackete auseinander halten kannst und somit auch weisst ob ein Packet vollständig ist und du es verarbeiten (entschlüsseln) kannst.

Sko 5. Jul 2007 11:17

Re: Buffer ver-/entschlüsseln mit RCx
 
Naja, laut Doku zur Kompo werden diese Events aufgerufen bevor das Paket durchs Protokoll auseinander genommen wird:
Zitat:

OnDecryptData wird ausgelöst, wenn ein Datenpaket aus der
Serververbindung gelesen wurde und vor der Weiterverarbeitung
entschlüsselt werden soll. Das Datenpaket ist als „strukturloses Stück Speicher“ zu betrachten.

OnEncryptData wird ausgelöst, wenn ein Datenpaket für den Versand zum Server bereit ist
und verschlüsselt werden soll. Wird keine Ereignisbehandlungsmethode bereitgestellt, werden
die Daten unverschlüsselt zum Server übertragen. Für die Entschlüsselung der Daten beim Empfang
im Server wird dort das Ereignis OnDecryptData ausgelöst. Das Datenpaket ist als
„strukturloses Stück Speicher“ zu betrachten.
EDIT: ich hab die Frage nochmal im Topic zu Komponente im DF gepostet: [Link]

Muetze1 5. Jul 2007 11:23

Re: Buffer ver-/entschlüsseln mit RCx
 
Zitat:

Zitat von Sko
Naja, laut Doku zur Kompo werden diese Events aufgerufen bevor das Paket durchs Protokoll auseinander genommen wird:

Nein, widerspricht nicht meiner Aussage. Es ist ein
Zitat:

„strukturloses Stück Speicher“ zu betrachten.
. Diese kannst du aneinander reihen oder auch auseinander nehmen. Da wird auch kein Protokoll erwähnt welches dies macht. Ein Klotz an Daten der versendet bzw. empfangen wurde, dieser wird den Routinen übergeben. Das auf die Trennung der Datenpackete geachtet wird, steht auch dort nicht.

Sko 5. Jul 2007 11:31

Re: Buffer ver-/entschlüsseln mit RCx
 
Hmm, na gut, dann könnte ich probieren das direkt in der Komponente zu machen, an der Stelle wo das dann auseinandergenommen wird und nicht den ganzen Datenstrom ver-/entschlüsseln, sondern nur den Teil den Inhalt der "Frames" ohne den Header mit zu verschlüsseln.

Muetze1 5. Jul 2007 12:02

Re: Buffer ver-/entschlüsseln mit RCx
 
Zitat:

Zitat von Sko
Hmm, na gut, dann könnte ich probieren das direkt in der Komponente zu machen, an der Stelle wo das dann auseinandergenommen wird

Nur damit es keine Mißverständnisse gibt: Die Komponente nimmt nichts auseinander, sie empfängt einfach nicht mehr bzw. nur diesen Teil (also der Socket kann nur diese Teilung/Block liefern)

negaH 5. Jul 2007 13:54

Re: Buffer ver-/entschlüsseln mit RCx
 
Besser. Dein Fehler liegt darin das du jedesmal lokal den RCx mit dem Passwort initialisierst.

Die grundsätzliche Philosophie beim TCP/IP lautet: Der kontinuierliche Datenstrom wird in Packete zerlegt die dann mit unterschiedlicher Geschiendigkeit und über verschiedene Datenkanäle im WEB verteilt übertragen werden und auf Clientseite durcheinander empfangen werden können, ABER vom TCP/IP treiber des Systemes IMMER in korrekter Reihenfolge wieder zusammengebastelt werden, es entsteht wieder ein korrekter und fehlerfreier Datenstrom. TCP/IP stellt also sicher das die Daten ohne Fehler wieder empfangen werden.

Ergo: bevor du Daten versendest initialisierst du zwei globale Variable die RCx enthalten und in deinen Eventhandlern rufst du nur noch RCxEncode()Decode() auf.

Gruß Hagen


Delphi-Quellcode:
procedure TMainForm.ClientEncryptData(Sender: TObject; PA: TProtocolAdapter; var Buffer; const Size: Integer);
begin
  RCxEncode(FRCxEncoide, Buffer, Buffer, Size);
end;

procedure TMainForm.ClientDecryptData(Sender: TObject; PA: TProtocolAdapter; var Buffer; const Size: Integer);
begin
  RCxDecode(FRCxDecode, Buffer, Buffer, Size);
end;
FRCxEncode und FRCxDecode sind Felder deines TForms und werden in deinem äußeren Protokollhandler initialisiert, also wenn der Client<->Server mit ihrem Datenaustausch beginnen.

Gruß Hagen

negaH 5. Jul 2007 13:59

Re: Buffer ver-/entschlüsseln mit RCx
 
Andererseits, warum RXc benutzen wenns viel besseres gibt ? Ja schon alles fertig ?

Schau mal hier http://www.delphipraxis.net/internal...976&highlight=

Hier hast du was wesentlich sicheres. Nicht nur die Daten werden sicher verschlüsselt sondern auch der Login-Prozess, also wenn sich Client/Server untereinander verbidnen, wird gesichert. Also nur wenn sich der Client und Server gegenseitig authentifiziert haben (ihren unfälschbaren digitalen Ausweiß gezeigt haben) wird eine verschlüsselte Kommunikation aufgebaut. Ich habe das alles in eine DLL die Interfaces benutzt eingebaut, also relative einfach zu benutzen.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.
Seite 1 von 2  1 2      

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