Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Secure Chat (https://www.delphipraxis.net/136539-secure-chat.html)

cherry 2. Jul 2009 13:24


Secure Chat
 
Hallo zusammen

Ich würde gerne ein kleines Chat Programm realisieren, mit Clients und einem Server. Nun, das ist nur die halbe Warheit...
Die Kommunikation übers Netzwerk (LAN) soll verschlüsslet sein, sodass man die Nachrichten die hin- und hergeschickt werden nicht
in Klartext auslesen kann.

Nun, mit welchen Komponenten soll ich arbeiten? wie verschlüsseln?
gibts n Turorial?

Danke schon ma.

Sherlock 2. Jul 2009 13:26

Re: Secure Chat
 
Nimm eines der zahllosen Chatprogrämmelchen, die hier kursieren, oder auch IP-Komponenten als Beispiele beiliegen und denk Dir halt was aus, wie die zu sendenden Strings ver und entschlüsselt werden können.

Wie Du verschlüsselst ist Geschmackssache:
http://de.wikipedia.org/wiki/Rot13
http://de.wikipedia.org/wiki/Shannon-Fano-Kodierung
oder echte Verschlüsselungen, die nicht so leicht zu knacken sind:
http://de.wikipedia.org/wiki/Data_Encryption_Standard
http://de.wikipedia.org/wiki/Rijndael
und hier jetzt ein Tut:
http://www.codeproject.com/KB/security/TEA.aspx

Sherlock

cherry 2. Jul 2009 13:31

Re: Secure Chat
 
Ja, danke. Das ist ja mein Problem. Ich suche eine gute Möglichkeit wie ich die Informationen verschlüsselt austauschen kann. Desshalb frage ich ja auch hier im Forum
nach, damit mir jemand was empfehlen kann was gut und "modern" ist.

Wenns nicht sein muss, möchte ich die das ent- verschlüsseln nicht selber coden, sondern von vorhandenen Projekten wie OpenSSL oder ähnliches profitieren.

jfheins 2. Jul 2009 13:32

Re: Secure Chat
 
Verwende eine symmetrische Verschlüsselung für die Kommunikation. (z.B. AES oder Twofish)

Um den Schlüssel zu übermitteln, empfiehlt sich eine asymmetrische Verschlüsselung wie RSA.

Für dein eigentlichen "verschlüsselungs-Kram" kannst du das DEC verwenden ;)

Sherlock 2. Jul 2009 13:34

Re: Secure Chat
 
Hier wird die Benutzung von DEC diskutiert:
http://www.delphipraxis.net/internal...t.php?t=127882

Sherlock

franktron 2. Jul 2009 13:38

Re: Secure Chat
 
Warum nicht mit z.b. Indy die haben eine SSLHandler damit geht das ganz einfach

cherry 2. Jul 2009 14:01

Re: Secure Chat
 
Zitat:

Zitat von jfheins
Für dein eigentlichen "verschlüsselungs-Kram" kannst du das DEC verwenden ;)

Klingt interessant. Habe das hier -> http://www.michael-puff.de/Developer...agen_Reddmann/ heruntergeladen, kanns aber für D2009 nicht kompillieren ->

habe mal versucht die DEC.dpk für D7 zu kompillieren, anscheinend findet er die dateien nicht ->

[DCC Fataler Fehler] DEC.dpk(59): F2063 Verwendete Unit 'blablabla' kann nicht compiliert werden

EDIT:

Habe jetzt die Pfade angepasst, aber jetzt habe ich ein anderes Problem:

[DCC Fehler] NMath.pas(200): E2029 Deklaration erwartet, aber Dateiende gefunden
[DCC Fehler] NMath.pas(72): E2065 Ungenügende Forward- oder External-Deklaration: 'IsEqualGUID'
[DCC Fehler] NMath.pas(73): E2065 Ungenügende Forward- oder External-Deklaration: 'NPool'
.
.
.
[DCC Fataler Fehler] DEC.dpk(59): F2063 Verwendete Unit '..\Part_II\LibIntf\NMath.pas' kann nicht compiliert werden

Die Unit NMath.pas ist ja garnicht fertig?!

Wo krieg ich ein funktionierendes Realease für D2009?

jfheins 2. Jul 2009 18:27

Re: Secure Chat
 
Zitat:

Zitat von cherry
...

Wo krieg ich ein funktionierendes Realease für D2009?

Guck mal, ob das funktioniert: http://www.delphipraxis.net/internal...t.php?t=145563 ;)

cherry 3. Jul 2009 06:58

Re: Secure Chat
 
Super, Danke!

Scheint jedenfalls zu funktionieren. Habe mal das Beispielprogramm erstellt welches im ZIP-Archiv vorhanden war.

Example.txt

Delphi-Quellcode:
The following code-snippet shows how to use the encryption and decryption
for widestrings/unicodestrings in a safe way:

---

uses
  DECUtil, DECCipher, DECHash, DECFmt;
 
...

var
  ACipherClass: TDECCipherClass = TCipher_Rijndael;
  ACipherMode: TCipherMode = cmCBCx;
  AHashClass: TDECHashClass = THash_Whirlpool;
  ATextFormat: TDECFormatClass = TFormat_Mime64;
  AKDFIndex: LongWord = 1;

function Encrypt(const AText: String; const APassword: String): String; overload;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(AData, Length(AText) * SizeOf(AText[1]));
    Encode(AText[1], AData[1], Length(AData));
    Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

function Encrypt(const AText: WideString; const APassword: WideString): WideString; overload;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(AData, Length(AText) * SizeOf(AText[1]));
    Encode(AText[1], AData[1], Length(AData));
    Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

function Decrypt(const AText: String; const APassword: String): String; overload;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    if ACheck <> CalcMAC then
      raise Exception.Create('Invalid data');
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

function Decrypt(const AText: WideString; const APassword: WideString): WideString; overload;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    if ACheck <> CalcMAC then
      raise Exception.Create('Invalid data');
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  s, k: WideString;
begin
  s := 'The quick brown fox jumps over the lazy dog';
  k := 'password';
  Memo1.Lines.Clear;
  Memo1.Lines.Add(
    'Encode Test: ' + Encrypt(s, k) + sLineBreak +
    'Decode Test: ' + Decrypt(Encrypt(s, k), k)
  );
end;
wenn ich das richtig verstehe, wird der Text mit dem Rijndael (AES) verschlüsselt?!
Dann kann ich ja so einen ziemlich sicheren Chat machen oder?! - Spielt die Passwortlänge eine Rolle für die
Sicherheit, wenn ja, wie lange sollte das Passwort mindestens sein?


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