2013-06-24 48 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