2016-06-08 77 views
0

我不得不重新創建從c#到php的東西。 我真的不知道該做什麼因爲我從來沒有真正處理過像加密之類的事情。從C#到PHP的DES加密不按預期方式工作

在C#中,我得到這個:

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; 
    } 

,我必須使用密鑰進行加密類似如下:

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); 

「緩衝」來自其中有一個文件的USB驅動器在其上包含16個字符的萬能鑰匙。 我真的不知道如何在PHP中實現它。我嘗試了很多像pack('C *',$ var)之類的東西,但是我沒有得到相同的結果。 這裏有誰知道如何處理它?我不知道如果我在正確的道路,但我想這樣的事情:

$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

考慮接受有用的答案。 要接受答案,請點擊最佳答案旁邊的空白複選標記,這樣做會增加您的聲望並提供更多功能,請參閱[聲譽常見問題](http://stackoverflow.com/faq#reputation)請參閱[本頁](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)瞭解更多詳情。 – zaph

回答

1

'1'在C#中的字符文字。在默認的ASCII假設下字符可以直接轉換爲字節。所以'1'實際上是一個0x31字節,而不是像PHP中的0x01字節。

你「想」:

$key = "12345678"; 

無論是$buffer譯碼正確取決於它的內容,你怎麼看它。


一些注意事項:

  • 不要使用DES時下。這真的不安全。 AES是一個更好的選擇。

  • 千萬不要使用ECB mode。它是確定性的,因此不具有語義安全性。您至少應該使用像CBCCTR這樣的隨機模式。最好是驗證你的密文,以便像padding oracle attack這樣的攻擊是不可能的。這可以通過驗證模式(如GCM或EAX)或encrypt-then-MAC方案完成。

+0

起初。感謝您的答覆。我知道DES是不安全的,但我無法改變它,因爲它用於這樣的生產系統。歐洲央行也是如此。所以$ key =「12345678」等價於我在問題中寫的c#的「字節」? – Goneja

+0

@Goneja因此,安全並不是優先事項,在當今時代很有趣。我希望你讓你的用戶知道安全性很差。 – zaph

+0

老兄,這裏有一點更多,然後只是改變1小小的PHP腳本中的1加密方法。 – Goneja