title: Converting Ruby AES256 decrypt function to PHP
body: <p>I have the following function in Ruby that decrypts a bit of data:</p>
  
  <pre><code>def decrypt(key, iv, cipher_hex)
      cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
  
      cipher.decrypt
      cipher.key = key.gsub(/(..)/){|h| h.hex.chr}
      cipher.iv = iv.gsub(/(..)/){|h| h.hex.chr}
  
      decrypted_data = cipher.update(cipher_hex.gsub(/(..)/){|h| h.hex.chr})
      decrypted_data &lt;&lt; cipher.final
  
      return decrypted_data
  end
  </code></pre>
  
  <p>I'm trying to do the exact same thing in PHP, but I'm not sure what I'm doing wrong. Here's what I've got:</p>
  
  <pre><code>function decrypt_data($key, $iv, $cipher_hex) {
      return mcrypt_decrypt(
          MCRYPT_RIJNDAEL_128, 
          hex_to_str($key), 
          hex_to_str($cipher_hex), 
          MCRYPT_MODE_CBC, 
          hex_to_str($iv)
      );
  }
  
  function hex_to_str($hex_str) {
      preg_match_all('/(..)/', $hex_str, $matches);
  
      $to_return = '';
      foreach ($matches[1] as $val)
          $to_return .= chr(hexdec($val));
      return $to_return;
  }
  </code></pre>
  
  <p>The output just ends up being garbage, not the string I'm looking for. Ideas?</p>
  
  <p>And before we even start, switching it to <code>MCRYPT_RIJNDAEL_256</code> doesn't seem help and just causes it to complain about the iv not being as long as the block size. I believe 128 is correct in this case since <a href="http://www.chilkatsoft.com/p/php_aes.asp" rel="nofollow noreferrer">this site</a> says that the 128/256 is an indication of the block size, not the key size.</p>