简体   繁体   中英

PHP and C# 3DES Encryption

Need to convert the following function from PHP to 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;
}

Where $message is a string to encode and $key is the key

The $key is base 64 encoded and it is decoded before calling the function

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

Following C# code I used:

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

where

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

and

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

    }

The results from PHP and C# are not the same.

I found a code that works for me in this spanish web. http://www.resuelvetusproblemas.com/convertir-encriptacion-en-php-3des-en-c/

This is the function in C# would be the same as you've written in 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;
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM