title: PHP and C# 3DES Encryption
body: <p>Need to convert the following function from PHP to C# (asp.net)</p>
  
  <pre><code>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 &gt;= 4.0.2
  
      // Se cifra
      $ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv); //PHP 4 &gt;= 4.0.2
      return $ciphertext;
  }
  </code></pre>
  
  <p>Where 
  <code>$message</code> is a string to encode and <code>$key</code> is the key</p>
  
  <p>The <code>$key</code> is base 64 encoded and it is decoded before calling the function</p>
  
  <pre><code>$key = $this-&gt;decodeBase64($key);
  $ciphertext = $this-&gt;encrypt_3DES($message, $key);
  </code></pre>
  
  <p>Following C# code I used:</p>
  
  <pre><code>key = Base64Decode(key);
  ciphertext = encrypt_3DES(order, key,true);
  </code></pre>
  
  <p>where</p>
  
  <pre><code> private  string Base64Decode(string base64EncodedData)
      {
          byte[] base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
          return Encoding.GetEncoding(28591).GetString(base64EncodedBytes);
          // 28591 for php compatibility
      }  
  </code></pre>
  
  <p>and</p>
  
  <pre><code>  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);
  
      }
  </code></pre>
  
  <p>The results from PHP and C# are not the same.</p>