Blowfish 2.er Versuch, war: Hash Funktion Fragen
-
Entferne am besten die Vererbung von TObject. Braucht kein Mensch:
im Header:class TBlowfish { private:
im Konstruktor (habe malloc durch new ersetzt):
//=========================================================================== // // Konstruktor // //=========================================================================== __fastcall TBlowfish::TBlowfish(unsigned char *key, int keyLen) { //Schlüsselfeld generieren ctx = new BLOWFISH_CTX;
Und dann kannst Du es so aufrufen:
String key = "Testschlüssel"; String msg = "Testnachricht"; TBlowfish c1((unsigned char *)key.data(), key.Length()); c1.Encrypt(&msg); TBlowfish c2((unsigned char *)key.data(), key.Length()); c2.Decrypt(msg);
Die Nachricht sollte ein Vielfaches von 64b sein, da es die Blocklänge ist. Wenn nicht, werden die fehlenden mit Leerzeichen aufgefüllt.
Schlüssellänge:
Bei Wikipedia steht: 32-448 Bit (Standard 128 Bit)
-
danke
das mit der schlüssellänge und nachrichtenlänge ist so ein problem.
wird der schlüssel wenn er zukurz ist nur mit leerzeichen aufgefühlt oder mit irgnedwelchen zeichen aus dem speicher??
wenn 2. dann muss ich ja noch abfangen wie lang der schlüssel ist und ihn manuell auffühlen oder?nochmals danke für die tolle erklärung
-#########Edit###########-
Hab beides in eine .h und eine .cpp kopiert, deine änderungen vorgenommen, in mein Projekt importiert und in der Unit2 durch #include "BlowFish.h" eingebunden.
dann kommt aber ein fehler:
[Linker Error] Error: 'F:\EIGENE DATEIEN\BORLAND STUDIO PROJECTS\BlowFish\BLOWFISH.H' contains invalid OMF record, type 0x23was heist das nun wieder XD
ich bin zu doof einen einfachen code einzubinden -.-
-
Puccini schrieb:
das mit der schlüssellänge und nachrichtenlänge ist so ein problem.
wird der schlüssel wenn er zukurz ist nur mit leerzeichen aufgefühlt oder mit irgnedwelchen zeichen aus dem speicher??
wenn 2. dann muss ich ja noch abfangen wie lang der schlüssel ist und ihn manuell auffühlen oder?Wenn der Schlüssel nur aus einem Zeichen besteht, wird eben de Text nur schwach verschlüsselt. Wenn er aus 0 Zeichen besteht, gibt es eine Exception beim Initialisieren des Schlüsselfeldes (key[j]). Könnte man im Konstruktor testen,wenn: keyLen < 1 throw std::logic_error();
Puccini schrieb:
Hab beides in eine .h und eine .cpp kopiert, deine änderungen vorgenommen, in mein Projekt importiert und in der Unit2 durch #include "BlowFish.h" eingebunden.
dann kommt aber ein fehler:
[Linker Error] Error: 'F:\EIGENE DATEIEN\BORLAND STUDIO PROJECTS\BlowFish\BLOWFISH.H' contains invalid OMF record, type 0x23was heist das nun wieder XD
ich bin zu doof einen einfachen code einzubinden -.-Nicht den Header binden. Dass muss nur der Compiler, sehen, der Linker bindet nur .o und .a/.lib-Files.
-
also die h nicht ins projekt importieren sondern nur über include??
und ist das 2. c oder cpp als datei?
weil im code steth als comment BlowFish.c, da bringt mir aber mein Compiler nen fehler...
-
BlowFish.c ist die originale Dateibezeichnung von Paul Kocher.
Wenn Du die beiden Dateien als blowfish.h und blowfish.cpp benannt hast, muss blowfish.h in blowhish.cpp einbinden und das Encrypt.h entfernen:
#include "Encrypt.h" => #include "blowfish.h"
-
alles klar!
das hätte man sehen sollen. is halt so wenn man nur code kopiert :<
jetzt gehts1000Dank nochmals!
bei weiteren Problemen meld ich michnochmal
-
wie gesagt, bei fehlern melde ich mich nochmal....
ich hab ab- und zu ein fehlverhalten bei der entschlüsselung.
wenn ich zB das wort "test" mit dem key "test" verschlüssel, kommt es bei der entschlüsselung zu einer fehldarstellung...
auch bei anderen wörtern oder zahlen hab hab ich das feststellen müssen.wie kann ich das beheben? :<
-
Ich habe es jetzt nochmal durch ein UnitTest gejagt, es treten keine Fehler auf. Ist denn das Ergebnis kryptisch? Zeig' mal den Quelltext.
-
Hier mal der Fehler:
klartext:
testverschlüsselt:
Â]÷Á†zqtentschlüsselt:
O%ˆ(ÍêVerschlüsselungspasswort:
test-.-
quellcode ist deiner vom 1.posthier.
und hier wird verschlüsselt:
String key = EditPasswort->Text; TBlowfish c1((unsigned char *)key.data(), key.Length()); String PW = Form1->EditPasswort->Text; String msg = PW.c_str(); c1.Encrypt(&msg); fstream outStream(Pfad.c_str(),ios::out); outStream<<msg.c_str()<<endl; outStream.close();
und hier wieder entschlüsselt:
String key = EditPasswort->Text; TBlowfish c1((unsigned char *)key.data(), key.Length()); String AnsiPW; string PW; inStream.open(Pfad.c_str(), ios::in); getline(inStream,PW); AnsiPW=PW.c_str(); c1.Decrypt(AnsiPW); inStream.close();
was läuft da falsch?? :<
liegt es an meinen String und string und der konvertierung mit .c_str()??
das da irgendwas falsch läuft?
-
Wenn Du die verschlüsselte Botschaft in den Stream speicherst, hängst Du ein std::endl dran. OK, wenn Du die Datei wieder einspielst, verwendest Du getline(), welches des Dateiinhalt bis zum std::endl einliest und dieses endl verwirft.
Die verschlüsselte Botschaft ist aber binär, alle möglichen Zeichen können darin vorkommen, auch std::endl (als was es auch immer implementiert ist). Wenn also zufällig in der verschlüsselten Botschaft mal ein std::endl auftaucht, wird nur bis zu diesem Zeichen gelesen und der Rest nicht verwendet. Du hast nun zwei Optionen:
- Die verschlüsselte Botschaft vorher in ein transportfähigen Zustand wandeln (nach dem Verschlüsseln, vor dem Schreiben in die Datei in Base64 oder in ein Hexstring wandeln; nach dem Auslesen aus der Datei, vor dem Entschlüsseln entsprechend mit dem Komplement behandeln
- oder dafür zu sorgen, dass nur und exakt die verschlüsselte Botschaft in die Datei geschrieben wird:
+ sicherstellen, dass die Datei im Binärmodus geschrieben und gelesen wirdfstream outStream(Pfad.c_str(), ios::binary | ios::out);
+ kein std::endl an die Datei hängen
+ beim Einlesen nicht getline() verwenden, sonder eher get() oder read()
-
das mit dem binär klingt gut.
muss ich bei read nicht eine länge angeben?
wie komme ich an die ran?
danke für den hinweis
hab ich garnet dran gedacht das auch endl als zeichen auftauchen kann.würdest du mir einen kurzen code oder verweis zeigen wo das read() behandelt wird??
MfG Puccini
-
Speichere am Anfang deines Streams die Länge mit ab, dann weißt du beim Einlesen wieviel das wird.
-
Wenn es jemanden Interessiert:
hier ist das vorerst fertige Projekt:
http://ragesoft.de/index.php?option=com_content&task=view&id=26&Itemid=
Für Verbesserungsvorschläge und Ideen bin ich immer zu haben.
Ich hab für die nächste version schon einiges mehr geplant. das hier ist sozusagen der release um zu sehen ob sowas angenommen wird.
Wenn es euch gefallen hat, wäre es schön wenn ihr im Blog einen eintrag dazu hinterlassen würdet!
Danke vielmals!