Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String Blowfish verschlüsseln OHNE DEC (https://www.delphipraxis.net/72385-string-blowfish-verschluesseln-ohne-dec.html)

Escalade 29. Jun 2006 14:33


String Blowfish verschlüsseln OHNE DEC
 
Hallo!
Ich möchte einen String mittels Blowfish verschlüsseln und entschlüsseln. Dazu möchte ich eine möglichst schlanke und einfache Unit schreiben. Ich möchte dabei *nicht* das DEC benutzen, da mein Code später in eine Standardsoftware einfliesst und es nicht möglich ist, das doch recht umfangreiche DEC einzubinden.

Ich habe schon mehrere Stunden Recherche im Netz und hier im Forum investiert, aber bin leider nicht fündig geworden.

Leider reicht mein Kryptographiewissen auch nicht aus, um selbst eine solche Klasse/Unit zu schreiben. Auch die entsprechenden Funktionalitäten aus dem DEC zu ziehen, ist mir nicht gelungen. :wiejetzt:

Daher meine Frage, ob jemand vielleicht schon sowas gelöst hat und mir zur Verfügung stellen könnte oder einen hilfreichen Link hat. Vielleicht kann auch jemand den Code dafür hier posten, wenn es nicht dem Umfang sprengt. :-D Ideal wäre eine schlanke und einfache Implementierung des Blowfish Algorithmus und Funktionen zum Codieren und Decodieren.

Danke für Eure Antworten und Hilfestellungen!

Klaus01 29. Jun 2006 14:37

Re: String Blowfish verschlüsseln OHNE DEC
 
Hallo,

kannst im Web mal nach LockBox suchen.
Das sind Komponeten zum verschlüsseln.

und der Link dazu -> http://sourceforge.net/projects/tplockbox/

Grüße
Klaus

Luckie 29. Jun 2006 14:53

Re: String Blowfish verschlüsseln OHNE DEC
 
Zitat:

Zitat von Escalade
Ich möchte dabei *nicht* das DEC benutzen, da mein Code später in eine Standardsoftware einfliesst und es nicht möglich ist, das doch recht umfangreiche DEC einzubinden.

Was verstehst du unter "einbinden"? Das DEC fügst du ganz normal als Unit in den uses hinzu und benutzt die Fuktionen, fertig.

Escalade 29. Jun 2006 14:58

Re: String Blowfish verschlüsseln OHNE DEC
 
Hi,
die Lockbox werde ich mir mal anschauen, danke für den Tipp.

@Luckie: Ja, ich weiss, aber ich hätte gerne etwas weniger umfangreiches. :?

negaH 29. Jun 2006 15:59

Re: String Blowfish verschlüsseln OHNE DEC
 
Lockbox wird aber noch mehr deine Source und die fertigen Module aufblähen.

Bindest du das neue DEC 5.1. ein kann ich dir garantieren das fast keinerlei zusätlicher Overhead ausser dem Blowfish Algo. eingebunden wird. Das ist ja gerade ein wichtiger Verbesserungpunkt im DEC 5.1. Aber das ist letzendlich deine Entscheidung.

Gruß Hagen

Escalade 30. Jun 2006 08:22

Re: String Blowfish verschlüsseln OHNE DEC
 
Hallo nochmal,
ich sehe ich habe mir das wohl auch etwas zu einfach vorgestellt. Ich werde dann jetzt doch mal das dec versuchen. Ich danke Euch auf jedenfall für Eure Antworten! :-D
Ciao

Escalade 30. Jun 2006 09:25

Re: String Blowfish verschlüsseln OHNE DEC
 
Vielleicht könnt ihr mir bei benutzen des DEC Hilfe geben, ich blicke da nicht ganz durch. :oops:

Meine Unit bekommt einen Blowfish-Verschlüsselten Querystring übergeben (base64 encoded), das Passwort weiss ich. Ich möchte diesen verschlüsselten Querystring nun einfach nur entschlüsseln und als String weiternutzen. Wie mache ich das am besten? Ich habe mir aus einem Post von Hagen mal die untenstehende Funktion herauskopiert und leicht modifiziert, aber noch läuft da nichts:

Delphi-Quellcode:
unit ucpDecryptExternQueryString;
...
uses ..., DECCipher, DECUtil, DECRandom, DECHash;
...

function TCPDecryptExternQueryString.Decipher: string;
begin
  with TCipher_Blowfish.Create do
  try
    Mode := cmCTSx; // <--- Welchen Mode nehme ich hier am besten?
    Init('Passwort');
    Result := DecodeBinary('Test Nachricht', TFormat_HEX); // <---- Frage 2
  finally
    Free;
  end;
end;
Meine Fragen:
1. Welchen Mode muss ich nutzen, und warum? Den Querystring, den ich übergeben bekomme, kommt von einem Portal dessen Code ich nicht kenne und ich weis nicht, mit welchen Mitteln dort Blowfish-Verschlüsselt wird. Muss dort zum entschlüsseln derselbe Mode verwendet werden? Ich habe von Kryptografie leider so garkeine Ahnung.

2. Ist DecodeBinary hier die richtige wahl? Ich habe ja einen String und will einen String...

3. Was fehlt in der obigen Unit sonst noch, damit die entschlüsselung läuft? Delphi (7) meckert bei mir z.B. auch, dass er TFormat_HEX nicht kennt.

Vielen Dank schonmal im Vorraus für Eure Hilfe. Ich denke das auch viele andere Forumsleser davon profitieren können.

negaH 30. Jun 2006 09:51

Re: String Blowfish verschlüsseln OHNE DEC
 
Ok ich stelle par Fragen und du antwortest mit JA/NEIN


1.) das Passwort ändert sich nur sehr wenig, weil es in der EXE steht ?

2.) du möchtest vorrangig kurze Strings schützen ?

3.) verschlüsselst du oft mit diesen einem Passwort auch die gleichen Strings ? Heist also ein String wie "Test" wird öfters ver/entschlüsselt !

4.) wie sicher muß das alles werden ? sehr sicher ?


Gruß Hagen

Escalade 30. Jun 2006 09:58

Re: String Blowfish verschlüsseln OHNE DEC
 
Zitat:

1.) das Passwort ändert sich nur sehr wenig, weil es in der EXE steht ? Ja, ändert sich nie

2.) du möchtest vorrangig kurze Strings schützen? Länge ca. 25-350 chars

3.) verschlüsselst du oft mit diesen einem Passwort auch die gleichen Strings ? Heist also ein String wie "Test" wird öfters ver/entschlüsselt! Ich verschlüssele nie, ich muss nur entschlüsseln. Das Verschlüsseln macht jemand anderes.

4.) wie sicher muß das alles werden ? sehr sicher ? Relativ sicher, aber ohne zu großen Aufwand.
Das enschlüsseln passiert pro Request genau einmal, also nicht all zu häufig.

Danke!

negaH 30. Jun 2006 13:31

Re: String Blowfish verschlüsseln OHNE DEC
 
Ok.

Bei kurzen Strings immer einen starken Feadback Modus benutzen der mit kleinem Feedback arbeitet. Also zb. cmCFB8 ist eine gute Wahl oder cmCFS8 wäre noch besser ist aber eine prohibitäre Entwicklung meinerseits. Solche Modis sind ca. 8 bis 16 mal langsammer als zv. cmCBCx oder cmCFSx dafüer aber gerade bei kurzen Daten weitaus sicherer.

Da sich das Passwort nicht verändert sollte man sicherstellen das wenigsten der verschlüsselte Output ein und derselben Nachricht sich ständig ändert. Das geht nätürlich nur wenn diese Nachricht sich virtuell jedesmal ändert. Lang Rede kurzer Sinn. Vor der Verschlüsselung deines Strings solltest du diesen mit 1-4 Bytes Zufallsdaten am Anfang des Strings ergänzen. Das führt dazu das der gleiche Text immer komplett anderen verschlüsselten Output erzeugt und somit ein Angreifer keine schnellen Angriffe mehr durchführen kann.
Das ist qausi wie ein Passwort Salt nur eben innerhalb der Nachricht. Der Feedback Modus cmCFB8 wird dann dafür sorgen das sich diese 1-4 Bytes Zufall komplett durch die ganze Verschlüsselungen deines Strings zieht.

Dir sollte aber klar sein das durch die Benutzung des festen Passwortes für alle Daten eine Alles oder Nichts Sicherheit ergibt. Wurde der Keys einmal geknackt sind alle deine Daten unsicher.

So nun ein par Sourcen

Delphi-Quellcode:
const
  Password: TGUID = {1234-1234-....} // mit Strg+G+G eine eigene GUID erzeugen
// das Password ist binär und nicht so schnell und direkt mit stupidem HEX Editor zu lesen
 
  CipherClass: TDECCipherClass = TCipher_Blowfish;
  CipherMode: TDECCipherMode = cmCFB8;
  SaltLenght: Integer = 4;
  TextFormat: TDECFormat = TFormat_MIME64;

function Encrypt(const Value: String): String;
begin
  with ValidCipher(CipherClass).Create do
  try
    Mode := CipherMode;
    Init(Password, SizeOf(Password));
    Result := EncodeBinary(RandomBinary(SaltLength) + Value, TextFormat);
  finally
    Free;
  end;
end;

function Decrypt(const Value: String): String;
begin
  with ValidCipher(CipherClass).Create do
  try
    Mode := CipherMode;
    Init(Password, SizeOf(Password));
    Result := System.Copy(SaltLength +1, MaxInt, DecodeBinary(Value, TextFormat));
  finally
    Free;
  end;
end;
Du kannst nun selber ausrechnen wie groß ein verschlüsselter String in der Länge sein wird,

MIME64_Länge := (Salt_Länge + String_Länge + 3) div 3 * 4

Ein 256 Zeichenstring ist also (256 + 4 + 3) div 3 * 4 = 348 Zeichen lang als MIME Base 64 formatierter und verschl. String.

Gruß Hagen

Alexander 1. Jul 2006 11:07

Re: String Blowfish verschlüsseln OHNE DEC
 
@Hagen Ist eigentlich auch eine .NET Version geplant?

mirage228 1. Jul 2006 12:15

Re: String Blowfish verschlüsseln OHNE DEC
 
Zitat:

Zitat von Alexander
@Hagen Ist eigentlich auch eine .NET Version geplant?

Hi,

Ich meine .NET hätte bereits eine Verschlüsselungskomponente integriert...
über die Qualität kann ich Dir aber nicht viel sagen.

mfG
mirage228

negaH 1. Jul 2006 12:40

Re: String Blowfish verschlüsseln OHNE DEC
 
About .NET:

Nein. (muß ich so sagen da ja keine Hoffnungen geweckt werden sollen)

Davon abgesehen ist ein großer "Vorteil" von .NET dessen strikte Implementation von Kryptrographie als essentieller Bestandteil. Ich selber habe keine Ahnung wie gut das in .NET gelösst ist und wie sicher diese Kryptographie ist. Aber es wäre logisch anzunehmen das das keine Anfänger konstrukiert und umgesetzt haben.

Aus meiner Sicht hat es also keinerlei Sinn eine Kryptolib für .NET zu schreiben, weil es doppeltgemoppelt wäre.
Und ein entscheidender "Negativpunkt" alle nicht-.NET Libraries ist deren strenge Integration in das OS. Das hat man bei .NET aber schon von Anfang an so vorgesehen.

Gruß Hagen

Alexander 1. Jul 2006 15:46

Re: String Blowfish verschlüsseln OHNE DEC
 
Schade :sad:. Aber kann man wohl nicht ändern...

Escalade 3. Jul 2006 10:16

Re: String Blowfish verschlüsseln OHNE DEC
 
Hallo Hagen,
vielen Dank für Deine so ausführliche Hilfe! :-D Ich werde das jetzt mal implementieren und Dir nochmal Feedback geben.
Danke nochmal!

Edit: Ich habe Probleme :oops:

Zitat:

[Error] uBlowfish.pas(14): Undeclared identifier: 'TDECCipherMode'
[Error] uBlowfish.pas(16): Undeclared identifier: 'TDECFormat'
[Error] uBlowfish.pas(16): Undeclared identifier: 'TFormat_MIME64'
[Error] uBlowfish.pas(52): There is no overloaded version of 'Init' that can be called with these arguments
Als uses habe ich eingebunden:
Delphi-Quellcode:
uses DECCipher, DECUtil, DECRandom, DECHash;
Fehlt da was?

negaH 3. Jul 2006 11:00

Re: String Blowfish verschlüsseln OHNE DEC
 
TDECCipherMode -> TCipherMode
TDECFormat -> TDECFormatClass
TFormat_MIME64 -> TFormat_MIME64 und DECFmt.pas in uses Klausel
.Init -> .Init(Password, SizeOf(Password), '', 0);


Sorry für diese Verwirrungen, aber ich musste einige Klassennamen etc.pp. verändern weil es Kollisionen zu einer anderen 3'rd Library gab.

Gruß Hagen

Escalade 4. Jul 2006 15:10

Re: String Blowfish verschlüsseln OHNE DEC
 
Ok super, die Fehler sind weg. Allerdings bekomme ich jetzt einen neuen Fehler:
Delphi-Quellcode:
[Fatal Error] uBlowfish.pas(54): Internal error: C1030
Wenn ich die Zeilen mit dem
Delphi-Quellcode:
Init(Password, SizeOf(Password), '', 0);
auskommentiere, kommt dieser Fehler nicht mehr.
Neustarten von Delphi hat auch nichts gebracht.

Hilfe! :shock:

negaH 4. Jul 2006 16:15

Re: String Blowfish verschlüsseln OHNE DEC
 
C1030 das C deutet auf einen Fehler im Compiler hin, sprich Parser etc.pp. Lxxxx Fehler sind zb. Fehler im Linker.

Probiere mal folgendes

Delphi-Quellcode:
Init(Password, SizeOf(Password), #0, 0);
ich teste das heute abend mal, jetzt muß ich erstmal geschäftlich los.

Ach, welche Delphi Version benutzt du ?

Gruß Hagen

Escalade 5. Jul 2006 08:13

Re: String Blowfish verschlüsseln OHNE DEC
 
Mit

Delphi-Quellcode:
Init(Password, SizeOf(Password), #0, 0);
kommt

Zitat:

[Error] uBlowfish.pas(48): There is no overloaded version of 'Init' that can be called with these arguments
Ich benutze Delphi 7 Professional Build 4.453

negaH 5. Jul 2006 10:20

Re: String Blowfish verschlüsseln OHNE DEC
 
Ok, machen wirs richtig !


Delphi-Quellcode:
var
  DummyIV: Byte;
begin
  ...blabla
  Init(Password, SoizeOf(Password), DummyIV, 0);
  ...blabla
end;
Das muß aber gehen.

Gruß Hagen

Escalade 5. Jul 2006 10:32

Re: String Blowfish verschlüsseln OHNE DEC
 
Ja, jetzt rennt es.
Vielen Dank Hagen, Du hast mir sehr geholfen! :-D


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