2009-04-01 10 views
1

Ich übersetze einen C++ TCP-Client in C#. Der Client wird verwendet, um 4 Bytes eines Arrays mit Blowfish zu codieren.C#: Blowfish Encipher ein einzelnes dword

C++ Blowfish

C# Blowfish(C# NET)

C++

BYTE response[6] = 
    { 
     0x00, 0x80, 0x01, 0x61, 0xF8, 0x17 
    }; 

    // Encrypt the last 4 bytes of the packet only(0x01,0x061,0xF8,0x17) 
    blowfish.Encode(responce + 2, responce + 2, 4); 

    // Send the packet 
    send(s, (char*)sendPtr, sendSize, 0); 

C#

responce = new byte[6] { 0x00, 0x80, 0x01, 0x61, 0xF8, 0x17}; 

    // Encrypt the last 4 bytes of the packet only(0x01,0x061,0xF8,0x17) 
    Handshake.blowfish.Encrypt(responce, 2, responce, 2, 4); 

    // Send the packet 
    WS.sock.Send(encrypted); 

In der C++ Code, wenn die Leitung "Blowfish.Encode" mit diesen Parametern aufgerufen wird, es geht in die cBlowfish.Encrypt Funktion

Um es zu verdeutlichen, wird die Schleife wegen der kurzen Länge der übergebenen Bytes nur einmal ausgeführt (4).

Nur ein Anruf von dieser riesigen Code ausgeführt wird (nur einmal), der Anruf:

Blowfish_encipher((DWORD *) pInput, (DWORD *)(pInput + 4)); 

// Bedeutung der Code der ersten beiden if-Anweisungen ist vorbei und verlässt dann die Schleife und die Funktion.

void cBlowFish::Blowfish_encipher(DWORD *xl, DWORD *xr) 
{ 
union aword Xl, Xr; 

Xl.dword = *xl; 
Xr.dword = *xr; 

Xl.dword ^= PArray [0]; 
ROUND(Xr, Xl, 1); 
ROUND(Xl, Xr, 2); 
ROUND(Xr, Xl, 3); 
ROUND(Xl, Xr, 4); 
ROUND(Xr, Xl, 5); 
ROUND(Xl, Xr, 6); 
ROUND(Xr, Xl, 7); 
ROUND(Xl, Xr, 8); 
ROUND(Xr, Xl, 9); 
ROUND(Xl, Xr, 10); 
ROUND(Xr, Xl, 11); 
ROUND(Xl, Xr, 12); 
ROUND(Xr, Xl, 13); 
ROUND(Xl, Xr, 14); 
ROUND(Xr, Xl, 15); 
ROUND(Xl, Xr, 16); 
Xr.dword ^= PArray [17]; 

*xr = Xl.dword; 
*xl = Xr.dword; 
} 

Die Definitionen:

Aus meiner Sicht wird die Lösung irgendwo in der encipher Funktion versteckt

#define S(x,i)   (SBoxes[i][x.w.byte##i]) 
#define bf_F(x)   (((S(x,0) + S(x,1))^S(x,2)) + S(x,3)) 
#define ROUND(a,b,n) (a.dword ^= bf_F(b)^PArray[n]) 

Das Problem ist, dass die Funktion Blowfish_Encipher in C++ zwei Parameter: Eingabe (xl) als dword und Ausgabe (xr) als dword.

Die C# Blowfish Encrypt_Block-Funktion hat vier Parameter, warum?

 public void EncryptBlock(uint hi,uint lo,out uint outHi,out uint outLo) 

Im Gegensatz zu dem C++ blowfish, EncryptBlock Anrufen Verschlüsseln statt Verschlüsseln EncryptBlock.Maybe EncryptBlock ist nicht der C++ Blowfish_Encipher zu nennen?

Wie auch immer, mein Problem ist, dass, wenn ich den C++ Code mit dieser Anordnung von 6 Bytes anrufe, die den Blowfish anfordert, nur die letzten 4 Bytes zu kodieren, tut es es.

Während Wenn ich die Verschlüsselungsfunktion in C# mit diesen 4 Bytes aufrufen, gibt es 0x00 zurück. (Wenn Sie den C# Blowfish sehen möchten, überprüfen Sie meine ersten Zeilen - ich habe einen Hyperlink dort hinzugefügt).

Hinweis Ich kann die Paketstruktur nicht ändern, es sollte einfach so sein, aber verschlüsselt.

Ich habe auch versucht dies:

die C++ Encrpypt Funktionen Wissen führt nur ein Anruf - Blowfish Encipher.I versuchte direkt EncryptBlock in C# zu nennen, aber es gibt Hallo Uint32 und Low Uint32 als Ein- und Ausgang, wie man verbreite sie in HI oder LO? Funktioniert das, wenn Encrypt_Block blogfish Encrypt in C# aufruft? Ich bin mir nicht ganz sicher.

Vielen Dank im Voraus!

+0

Duplizieren von http://stackoverflow.com/questions/704402/c-blowfish-works-with-wewer-letters-but-c-blowfish-doesnt und http://stackoverflow.com/questions/703351/c -blowfish-doesnt-work-with-lesson-letters –

+0

Ich kann sie nicht stoßen, ich habe einige Dinge in meinen vorherigen Fragen nicht gelöscht wie "Hinweis Ich kann die Paketstruktur nicht ändern, es sollte einfach so sein, aber verschlüsselt. ". Es gibt Antworten, die ich kommentiert habe, aber keiner der Leute, die sie geschrieben haben, ist interessiert genug, um auf meine Kommentare zu antworten. –

+0

Hmmm ... was ist mit dieser plötzlichen Welle von fast genau doppelt gestellten Fragen zur Blowfish-Verschlüsselung? – Noldorin

Antwort

1

Blowfish arbeitet mit acht Byte-Blöcken.Die einzige Möglichkeit, Daten zu verschlüsseln, die nicht mehr als acht Byte (oder ein Vielfaches von acht) umfassen, besteht darin, sie zu bereinigen (in diesem Fall mit Nullen).

Sie müssen einen 8-Byte-Puffer in Ihre C++ - Funktion übergeben, da Sie an Ort und Stelle verschlüsseln. Der Code, den Sie gepostet haben, verschlüsselt tatsächlich vier zusätzliche Bytes des benachbarten Speichers ((DWORD *)(pInput + 4)), was offensichtlich nicht das ist, was Sie wollen. Außerdem werden alle acht Ausgangsbytes benötigt, um zu entschlüsseln - so können Sie leider nicht einfach vier der verschlüsselten Bytes passieren und erwarten, dass sie am anderen Ende erfolgreich entschlüsselt werden.

Ich weiß, dass dies Ihr Problem nicht löst - ich sehe keinen Weg es zu lösen, da Sie nur vier Bytes verschlüsselter Daten senden wollen und Blowfish immer mindestens acht!

Verwandte Themen