2017-04-13 4 views
1

Ich habe einen Kunden, der uns benötigt, um Blowfish EZB Verschlüsselung mit CipherMode 0, Ausgang 1 zu verwenden. Ich habe versucht, dafür zu lösen, aber ich bleibe stecken. Wie behebe ich meinen Code?Blowfish ECB-Verschlüsselung in C# Implementierung

Hier sind die vollständigen Client Anweisungen:

Algorithmus: Blowfish · Modus: EZB · Padding: ist * Anfangsvektor PKCS5Padding unnötig, weil wir ECB-Modus verwenden.

Beispiel · Verschlüsseln Schlüssel: 2fs5uhnjcnpxcpg9 → Plain Text: 3280: 99: 20120201123050 → Cipher Text: daa745f1901364c0bd42b9658db3db96336758cd34b2a576 * Bitte Cipher Text mit 16 hexadezimalen Zeichen halten. * Bitte generieren Sie Cipher Text ohne "Salz".

Ich muss dies in C# schreiben. Hier ist, was ich tat, aber es scheint nicht zu funktionieren:

string member_id = "3280"; 
     string panelType = "99"; 
     string RandomString = "20120201123050"; 
     string encryptionKey = "2fs5uhnjcnpxcpg9"; 
     string cryptstr = member_id + ":" + panelType + ":" + RandomString; 
     string plainText = cryptstr; 
     BlowFish b = new BlowFish(encryptionKey); 
     string cipherText = b.Encrypt_ECB("3280:99:20120201123050"); 

Das Ergebnis nicht daa745f1901364c0bd42b9658db3db96336758cd34b2a576 ist. Was habe ich falsch gemacht?

+2

Wow, das ist über die schlechteste Sicherheits weise! Selbst der Autor von Blowfish benutzt es nicht mehr, jetzt benutzt er AES. Verwenden Sie nicht den ECB-Modus, es ist unsicher, siehe [ECB-Modus] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29), scrollen Sie nach unten zum Penguin. – zaph

+0

Was importieren Sie, um die Blowfish-Klasse zu erhalten? Und da ich sehe, dass Sie nichts für die Auffüllung einstellen, was ist der Standard, den Doc für die Bibliothek, die diese Blowfish-Klasse enthält, sagt, dass sie verwendet? –

+0

Schließlich ist es an der Zeit, die Sicherheit zu aktualisieren, AES ist seit 15 Jahren verfügbar, der Kunde sollte sich wirklich anstrengen, weitere 15 Jahre zu warten wäre lächerlich. – zaph

Antwort

1

Encrypt_ECB() so nehme ich seine Schneier-Klasse an.

Die Ctor erwartet eine hexadezimale Zeichenfolge, wenn man übergeben wird, können Sie die Überlastung für ein Byte-Array benötigen:

BlowFish b = new BlowFish(Encoding.UTF8.GetBytes(encryptionKey)); 

Der Ausgang ist immer noch nicht richtig, mal sehen, was es wirklich durch Entschlüsseln ihrem Beispiel sein sollte:

string clear = b.Decrypt_ECB("daa745f1901364c0bd42b9658db3db96336758cd34b2a576"); 

gibt uns:

"3280:99:20120201123050\u0002\u0002" 

was gut ist, aber es gibt 2 0 x2 Bytes am Ende, das N x 0xN ist wegen der PKCS-Auffüllung. Um die Übereinstimmung zu erhalten, müssen Sie die Eingabe pad:

// input to bytes 
List<byte> clearBytes = new List<byte>(Encoding.UTF8.GetBytes("3280:99:20120201123050")); 

// how many padding bytes? 
int needPaddingBytes = 8 - (clearBytes.Count % 8); 

// add them 
clearBytes.AddRange(Enumerable.Repeat((byte)needPaddingBytes, needPaddingBytes)); 

// encrypt 
byte[] cipherText = b.Encrypt_ECB(clearBytes.ToArray()); 

// to hex 
string cipherTextHex = BitConverter.ToString(cipherText).Replace("-", "").ToLowerInvariant();