使用TripleDES在c#中加密的字符串,需要在PHP中解密


String Encrypted in C# Using TripleDES, need to decrypt in PHP

c#代码是这样的(不能改变它,因为它是在客户端系统中)

namespace Common {
public static class EncryptionHelper
{
   private const string cryptoKey = "password";
// The Initialization Vector for the DES encryption routine
   private static readonly byte[] IV = new byte[8] { 240, 3, 45, 29, 0, 76, 173, 59 };
/// <summary>
/// Encrypts provided string parameter
/// </summary>
public static string Encrypt(string s)
{
   string result = string.Empty;
   byte[] buffer = Encoding.ASCII.GetBytes(s);
   byte[] k = Encoding.ASCII.GetBytes(cryptoKey);
   TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
   MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();

   des.Key = MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
   des.IV = IV;
   result = Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));
   return result;
  }
}
}

我发现客户端从这里开始上课:http://johnnycoder.com/blog/2008/07/03/c-encryption-decryption-helper-class/

我不是很熟悉c#,我需要解密字符串在PHP加密这段代码。

当我执行md5($key, true)我没有得到与"MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));"相同的结果,不知道为什么。

如何将"byte[] IV"转换为PHP字符串?

任何帮助都会很感激。谢谢你。

成功启动:

class Crypter
{
/**
 *
 * Encryption key
 *
 * @var
 */
protected $key;
/**
 *
 * Encryption vector
 *
 * @var
 */
protected $iv;
public function __construct()
{
    $this->key = config('auth.triple_des_key');
    $this->iv = implode(array_map("chr", config('auth.triple_des_iv')));
}

/**
 *
 * Decrypts string using tripleDES method.
 *
 * @param $input String
 * @return String
 */
public function decryptTripleDES($input)
{
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    $encryptedData = base64_decode($input);
    $key = iconv('utf-8', 'us-ascii//TRANSLIT', $this->key);
    $key = md5($key, true);
    $key .= substr($key, 0, 8);
    mcrypt_generic_init($td, $key, $this->iv);
    $decryptedData = mdecrypt_generic($td, $encryptedData);
    mcrypt_generic_deinit($td);
    //remove the padding text
    $block = mcrypt_get_block_size("tripledes", "cbc");
    $packing = ord($decryptedData{strlen($decryptedData) - 1});
    if ($packing and ($packing < $block)) {
        for ($P = strlen($decryptedData) - 1; $P >= strlen($decryptedData) - $packing; $P--) {
          if (ord($decryptedData[$P]) != $packing) {
              $packing = 0;
          }
      }
    }
    $decryptedData = substr($decryptedData, 0, strlen($decryptedData) - $packing);
    return $decryptedData;
}
}