PHP 和 C# 3DES 加密

PHP and C# 3DES Encryption

需要将以下函数从 PHP 转换为 C# (asp.net)

function encrypt_3DES($message, $key){
    // Se establece un IV por defecto
    $bytes = array(0,0,0,0,0,0,0,0); //byte [] IV = {0, 0, 0, 0, 0, 0, 0, 0}
    $iv = implode(array_map("chr", $bytes)); //PHP 4 >= 4.0.2

    // Se cifra
    $ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv); //PHP 4 >= 4.0.2
    return $ciphertext;
}

在哪里 $message 是要编码的字符串,$key 是密钥

$key 是 base 64 编码的,它在调用函数之前被解码

$key = $this->decodeBase64($key);
$ciphertext = $this->encrypt_3DES($message, $key);

我使用了以下 C# 代码:

key = Base64Decode(key);
ciphertext = encrypt_3DES(order, key,true);

哪里

 private  string Base64Decode(string base64EncodedData)
    {
        byte[] base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
        return Encoding.GetEncoding(28591).GetString(base64EncodedBytes);
        // 28591 for php compatibility
    }  

  private string encrypt_3DES(string message, string k,bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(message);

        //If hashing use get hashcode regards to your key
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(Encoding.GetEncoding(28591).GetBytes(k));
            //Always release the resources and flush data
            // of the Cryptographic service provide. Best Practice

            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.GetEncoding(28591).GetBytes(k);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //set the secret key for the tripleDES algorithm
        tdes.Key = keyArray;
        //mode of operation. there are other 4 modes.
        //We choose ECB(Electronic code Book)
        tdes.Mode = CipherMode.ECB;
        //padding mode(if any extra byte added)

        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        //transform the specified region of bytes array to resultArray
        byte[] resultArray =
          cTransform.TransformFinalBlock(toEncryptArray, 0,
          toEncryptArray.Length);
        //Release resources held by TripleDes Encryptor
        tdes.Clear();
        //Return the encrypted data into unreadable string format
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);

    }

PHP 和 C# 的结果不一样。

我在这个西班牙网站上找到了适合我的代码。 http://www.resuelvetusproblemas.com/convertir-encriptacion-en-php-3des-en-c/

这是 C# 中的函数,与您在 PHP

中编写的函数相同
    public static byte[] TripleDESEncrypt(string texto, byte[] key)
    {
        using (TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider())
        {
            byte[] iv_0 = { 0, 0, 0, 0, 0, 0, 0, 0 };

            byte[] toEncryptArray = Encoding.ASCII.GetBytes(texto);               

            tdes.IV = iv_0;

            //assign the secret key
            tdes.Key = key;

            tdes.Mode = CipherMode.CBC;

            tdes.Padding = PaddingMode.Zeros;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            //transform the specified region of bytes array to resultArray
            byte[] resultArray =
              cTransform.TransformFinalBlock(toEncryptArray, 0,
              toEncryptArray.Length);

            //Clear to Best Practices
            tdes.Clear();

            return resultArray;
        }
    }