2016-06-08 8 views
0

Ich muss Dinge von C# zu PHP neu erstellen. Ich weiß nicht wirklich, was ich tun soll, weil ich nie wirklich mit Dingen wie Verschlüsselung oder so etwas zu tun hatte.DES Verschlüsselung von C# zu PHP funktioniert nicht wie erwartet

In C# habe ich dies:

public static byte[] decrypt(byte[] data, byte[] key) 
    { 
     DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 

     des.Key = key; 
     des.Mode = CipherMode.ECB; 
     des.Padding = PaddingMode.None; 

     return des.CreateDecryptor().TransformFinalBlock(data, 0, data.Length); 
    } 

public static byte[] encrypt(byte[] data, byte[] key) 
    { 
     DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 

     des.Key = key; 
     des.Mode = CipherMode.ECB; 
     des.Padding = PaddingMode.None; 

     return des.CreateEncryptor().TransformFinalBlock(data, 0, data.Length); 
    } 

public static byte[] get8byte(string input) 
    { 
     byte[] ByteArray = new byte[8]; 
     string tmp = string.Empty; 
     int j = 0; 
     for (int i = 0; i < 16; i++) 
     { 
      tmp = "" + input[i]; 
      tmp = tmp + input[i + 1]; 
      ByteArray[j] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber); 
      j++; 
      i++; 
     } 
     return ByteArray; 
    } 

und der Schlüssel i zu verwenden ist verschlüsselt wie folgt aus:

var Buffer = new char[16]; 
var cMasterKey = new byte[8]; 
byte[] Key = { 
     (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', 
     (byte) '6', (byte) '7', (byte) '8' 
}; 
cMasterKey = DESUtils.get8byte(new string(Buffer)); 
MasterKey = DESUtils.decrypt(cMasterKey, Key); 

Der "Puffer" von einem USB-Laufwerk kommt, die eine Datei hat Darauf befindet sich ein Masterkey von 16 Chars. Ich weiß wirklich nicht, wie man es in PHP realisiert. Ich habe viele Dinge wie Pack ('C *', $ Var) und solche Sachen ausprobiert, aber ich habe nicht das gleiche Ergebnis bekommen. Gibt es hier jemanden, der weiß, wie man damit umgeht? Ich weiß nicht, ob ich auf dem richtigen Weg bin, aber ich versuchte, Dinge wie diese:

$key = pack('C*', 1, 2, 3, 4, 5, 6, 7, 8); 
$masterbyte = pack('C*', $buffer); 
$decmasterkey = mcrypt_decrypt(MCRYPT_DES, $key, $masterbyte, MCRYPT_MODE_ECB); 
+0

Übernehmen Sie die Annahme von Antworten, die hilfreich sind. Um eine Antwort zu akzeptieren, klicken Sie auf das hohle Häkchen neben der Antwort, die am besten ist. Dadurch erhöhen Sie Ihre Reputation und ermöglichen mehr Funktionen. Siehe [Ruf-FAQ] (http://stackoverflow.com/faq#reputation). Diese Seite] (http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work) für weitere Details. – zaph

Antwort

1

'1' in C# ist ein Zeichenliteral. Zeichen können unter der Standard-ASCII-Annahme direkt in ein Byte umgewandelt werden. So '1' ist eigentlich ein 0x31-Byte und kein 0x01-Byte wie Sie in PHP haben.

Sie „wollen“:

$key = "12345678"; 

Ob die Decodierung $buffer korrekt ist auf dessen Inhalt abhängig ist und wie Sie es lesen.


Einige Anmerkungen:

  • Sie DIE heutzutage nicht mehr verwendet werden. Es ist wirklich unsicher. AES ist eine bessere Alternative.

  • Niemals ECB mode verwenden. Es ist deterministisch und daher nicht semantisch sicher. Sie sollten zumindest einen zufälligen Modus wie CBC oder CTR verwenden. Es ist besser, Ihre Chiffrate zu authentifizieren, so dass Angriffe wie padding oracle attack nicht möglich sind. Dies kann mit authentifizierten Modi wie GCM oder EAX oder mit einem encrypt-then-MAC Schema geschehen.

+0

Zuerst. Vielen Dank für Ihre Antwort. Ich weiß, dass DES unsicher ist, aber ich kann es nicht ändern, weil es in einem Produktionssystem wie diesem verwendet wird. Das Gleiche gilt für die EZB. Also $ key = "12345678" ist das Äquivalent zu C# 's "bytething", das ich in der Frage geschrieben habe? – Goneja

+0

@Goneja Sicherheit ist keine Priorität, interessant in der heutigen Zeit. Ich hoffe, dass Sie Ihre Benutzer wissen lassen, dass die Sicherheit schlecht ist. – zaph

+0

Alter, es ist ein wenig mehr dahinter, dann nur 1 Verschlüsselungsmethode in 1 kleines PHP-Skript ändern. – Goneja

Verwandte Themen