Strings mit blowfish ver- und entschlüsseln
-
Hallo Forum,
hab schon einiges im Forum gesucht und per google, aber noch keine Lösung finden können. Zwar diverse Wege int, byte und dword zu ver-/entschlüsseln aber noch kein praktikablen weg finden können für strings (bzw. char*).
Kann mir da wer ein Tip geben?
-
Dann nimm doch einfach die Lösung für bytes. Ein char ist doch (in der Regel) ein byte groß. Chars sind doch auch nur Zahlen. Außerdem, woher hast Du eigentlich byte als Datentyp? Im Standard ist das nicht vorgesehen.
-
ok, ich schätze ich bin "etwas" eingerostet was c++ angeht. Kann ich ein char* - string in byte umwandeln und rückwerts?
-
MeisterMichi schrieb:
Kann ich ein char* - string in byte umwandeln und rückwerts?
Nochmals: Was verstehst du unter "Byte"? Ein
charist ein Byte gross und kann auch als solches verwendet werden. Allerdings solltest du aufsigned/unsignedachten.
-
Wie gesagt, ich weiß nicht was das für bytes sind. Gibt's sowas in der Winapi? Vielleicht tut's ein einfacher Cast? Poste Doch mal ein bisschen Code, dann kann man ihn anpassen. So ist das ganze Rätselraten.
Für Blowfish gibt's doch jede Menge sourcecode bei Wikipedia verlinkt. Z.B. hier:
http://www.schneier.com/blowfish-download.htmlDas hier: http://www.schneier.com/code/bfsh-con.zip
arbeitet mit einem (unschönen) Makro:#define BYTE unsigned charVielleicht meinst Du das? Jedenfalls könntest Du das ja mit minimalen Modifikationen benutzen. Einfach überall BYTE durch "unsigned char" ersetzten. Der ist dann genauso groß wie ein normaler "char". Also müsste ein static_cast für den Pointer seinen Dienst da tun. Probier's aus oder suche Dir etwas anderes Fertiges.
-
Wirdbald schrieb:
Das hier [...] arbeitet mit einem (unschönen) Makro:
#define BYTE unsigned charIn C++ nimmt man für das wenigstens ein Typedef (ich würde auch nicht nur Grossbuchstaben für Typen verwenden).
typedef unsigned char byte;Wirdbald schrieb:
Also müsste ein static_cast für den Pointer seinen Dienst da tun.
static_castfürchar-Pointer? Nein, nein. Wenn es sich um den selben Typen handelt, ist kein Cast erforderlich. Ansonsten brauchst du hierreinterpret_cast.
-
In C++ nimmt man für das wenigstens ein Typedef (ich würde auch nicht nur Grossbuchstaben für Typen verwenden).
Ich auch. Einverstanden. Ist aber in der verlinkten Bibliothek nun mal so.
Ansonsten brauchst du hier reinterpret_cast.
Gut, da hast Du recht. Schande über mein Haupt. Ohne Compilerwarnungen bin ich ein Nichts

Aber ohne konkreten Code kommen wir hier sowieso nicht weiter.
-
ja versuchen wir es mal mit ein Beispiel - dass macht sinn

Ich verwende die Klasse von schneier.com
CBlowFish o_bf; char c_key[] = "geheim1234"; char c_teststr[] = "test1234"; char c_buff[1024]; o_bf.Initialize((unsigned char*)c_key, 11); o_bf.Encode((unsigned char*)c_teststr, (unsigned char*)c_buff, 1024); printf("%s\n", c_buff);Die Ausgabe ist etwas,... binär
Weist mich gerne auf Logik- und Grundlagenfehler hin
-
MeisterMichi schrieb:
Weist mich gerne auf Logik- und Grundlagenfehler hin
Zwar nicht unbedingt einer dieser Fehler, aber trotzdem solltest du dir angewöhnen,
reinterpret_castanstelle der C-Klammercasts zu verwenden.Aber wieso legst du nicht gleich Arrays von
unsigned charan?Nun ja, wir kennen das Blowfish-Framework nicht, deshalb wissen wir auch nicht genau, was dort erwartet wird. Aber dazu sollte es doch sicher eine Dokumentation geben...
-
Ok, bis auf dass das ganze ziemlicher C-Stil ist, sieht das doch nicht so schlecht aus. Oder gibt's da ein Problem mit?
Das hier:
Die Ausgabe ist etwas,... binär
Ist ja wohl klar. Das ganze ist ja auch verschlüsselt. Da kommen keine sinnvollen Buchstaben bei raus. Du könntest das ganze in Hexadezimalziffern umwandeln. Dann ist es besser leserlich.
-
Hier, so kannst Du hexadezimalzahlen ausgeben. Dabei mit char* zu hantieren, weigere ich mich. Das musst Du selbst umwandeln, wenn Du char* bevorzugst:
#include <iostream> #include <string> using namespace std; int main() { string text = "abcdef"; for(string::const_iterator it=text.begin(); it!=text.end(); ++it) cout << ios::hex << *it << endl; return 0; }
-
Ich weiß nicht wo mein Problem lag bei dem ganzen hin- und her getestet, aufjedenfall nun mit dem bsp code
// void Initialize (BYTE key[], int keybytes) ; // DWORD GetOutputLength (DWORD lInputLong) ; // DWORD Encode (BYTE * pInput, BYTE * pOutput, DWORD lSize) ; // void Decode (BYTE * pInput, BYTE * pOutput, DWORD lSize) ; CBlowFish o_bf; char c_key[] = "geheim1234"; char c_teststr[] = "test1234"; char c_buff[1024], c_buff2[1024]; o_bf.Initialize((unsigned char*)c_key, 11); o_bf.Encode((unsigned char*)c_teststr, (unsigned char*)c_buff, 1024); o_bf.Decode((unsigned char*)c_buff, (unsigned char*)c_buff2, 1024); printf("%s\n", c_buff2);Klapt es.
Die Ausgabe ist gleich der Eingabe.
Auf jeden Fall: danke!
-
MeisterMichi schrieb:
Auf jeden Fall: danke!

Was sagst zu Folgendem?
Nexus schrieb:
[...] aber trotzdem solltest du dir angewöhnen,
reinterpret_castanstelle der C-Klammercasts zu verwenden.Aber wieso legst du nicht gleich Arrays von
unsigned charan?