2013-06-24 73 views
1

我有下面的C#代碼,但是我很難爲PHP mcrypt_decrypt()添加參數。PHP中的mcrypt_decrypt()函數中要添加什麼參數

private string Decrypt(string strText, string sDecrKey) 
    { 
     string message; 
     byte[] rgbKey = new byte[0]; 
     byte[] rgbIV = new byte[] { 0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef }; 
     byte[] buffer = new byte[strText.Length + 1]; 
     try 
     { 
      rgbKey = Encoding.UTF8.GetBytes(Strings.Left(sDecrKey, 8)); 
      DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
      buffer = Convert.FromBase64String(strText); 
      MemoryStream stream2 = new MemoryStream(); 
      CryptoStream stream = new CryptoStream(stream2, provider.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 
      stream.Write(buffer, 0, buffer.Length); 
      stream.FlushFinalBlock(); 
      message = Encoding.UTF8.GetString(stream2.ToArray()); 
     } 
     catch (Exception exception1) 
     { 
      ProjectData.SetProjectError(exception1); 
      Exception exception = exception1; 
      message = exception.Message; 
      ProjectData.ClearProjectError(); 
      return message; 
      ProjectData.ClearProjectError(); 
     } 
     return message; 
    } 

串mcrypt_decrypt(字符串$密碼,字符串$鍵,字符串$數據, 串$模式[,字符串$ IV])

我的數據是: - 「iHcKDE0aeDZU3q31ULZcvQ ==」

Key-:「&%#@?,:*」

我想用PHP mcrypt_decrypt()函數解密這個數據。我在C#中的知識很少,但是很好的PHP。請幫我

<?php 
$key = pack("nvc*",0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef); 
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB) 
$ciphertext_dec = base64_decode("iHcKDE0aeDZU3q31ULZcvQ=="); 
$iv_dec = substr($ciphertext_dec, 0, $iv_size); 
$retval = mcrypt_decrypt(MCRYPT_3DES, $key, $ciphertext_dec, MCRYPT_MODE_CFB, $iv_dec); 
echo $retval; 
?> 
+0

您是否收到任何錯誤?你能發佈你在PHP中試過的東西,而不是C#代碼嗎? – bnlucas

+0

echo mcrypt_decrypt(MCRYPT_3DES,$ key,$ ciphertext_dec,MCRYPT_MODE_CFB) –

+0

我得到的輸出是¼p_‡

回答

0

從外觀上來看,你需要創建一個iv,而不是$keysubstr關鍵運行substrmcrypt_get_key_size(cipher, mode),它似乎你與iv做。

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

而且iv應該從一個隨機的來源,而不是$key砍伐。雖然,iv是可選的。這是我能看到的唯一問題。

這是舊的,但它在我寫作時很適合我。 Cipher.php

<?php 
function encrypt($data, $key = null, $iv = null) { 
    $key = (strlen($key) == 0) ? $key = null : $key; 

    $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
    $key = hash("sha256", $key, true); 
    $key = substr($this->key, 0, $key_size); 

    if ($iv == null) { 
     $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    } 

    $out = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CFB, $iv); 
    return base64_encode($out); 
} 

function decrypt($data, $key = null, $iv = null) { 
    $key = (strlen($key) == 0) ? $key = null : $key; 

    $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
    $key = hash("sha256", $key, true); 
    $key = substr($this->key, 0, $key_size); 

    if ($iv == null) { 
     $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    } 

    $data = base64_decode($data); 
    $out = mcrypt_decrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CFB, $iv); 
} 

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$encrypted = encrypt('my data.', 'my secret key', $iv); 
$decrypted = decrypt($encrypted, 'my secret key', $iv); 

# $decrypted = 'my data.' 
?> 

更新

我也更容易互動更新Cipher.php。您不再需要專門設置iv,Cipher::encrypt來設置它並將其附加到加密數據。 Cipher::decrypt然後在解密加密數據之前提取它。

IV僅用於給加密例程提供替代種子。這個IV並不需要保密,雖然它可能是可取的。你甚至可以把它和你的密文一起發送而不會失去安全性。

+0

什麼將$關鍵參數... –

+0

在您的Cipher.php我將給密碼文本... –

+0

你有你的祕密'$鑰匙',我跑' sha256'放在一個字符串上,並用'mcrypt_get_key_size'將其剪下來,然後你就可以從隨機源生成你的'iv'。例如,在'Cipher.php'中,運行'$ encrypted = $ cipher-> encrpyt('my data','my secret key'); $ last_iv = $ cipher-> getIV(); $ decrypted = $ cipher-> decrypt($ encrypted,'my secret key',$ last_iv);' – bnlucas