Skip to content
Advertisement

Convert PHP code that create encryption key to c# MD5

I’m trying to convert the following code that create encryption key to c# the result I need the $key ** and ** $iv

$passphrase = 'asdfghjkl';
$salt =  '123456789' // for test purposes I fixed the value but it should be openssl_random_pseudo_bytes(8);
        $salted = '';
        $dx = '';
        while (strlen($salted) < 48) {
            $dx = md5($dx . $passphrase . $salt, true);
            $salted .= $dx;
        }
        $key = substr($salted, 0, 32);
        $iv = substr($salted, 32, 16);

what I could do until now

string passphrase = "asdfghjkl";
string salt = "123456789";
string key, iv;

byte[] salted = new byte[0];
byte[] dx = new byte[0];

while (salted.Length < 48)
      {
        string a = passphrase + salt;
        byte[] b = Encoding.UTF8.GetBytes(a);

        byte[] rv = new byte[dx.Length + b.Length];
        System.Buffer.BlockCopy(dx, 0, rv, 0, dx.Length);
        System.Buffer.BlockCopy(b, 0, rv, dx.Length, b.Length);

        //dx = MD5CryptoServiceProvider.Create().ComputeHash(rv);
        using (MD5 md5 = MD5.Create())
              {
                dx = md5.ComputeHash(rv);
              }

        byte[] rx = new byte[salted.Length + dx.Length];
        System.Buffer.BlockCopy(salted, 0, rx, 0, salted.Length);
        System.Buffer.BlockCopy(dx, 0, rx, salted.Length, dx.Length);

        salted = rx;
      }
string utfString1 = Encoding.UTF8.GetString(salted);
key = utfString1.Substring( 0, 32);
iv = utfString1.Substring(32, 16);

but I’m not getting the same result

thanks

Advertisement

Answer

The called PHP md5 function will return the md5 hash in raw binary format (16 bytes). Read more about PHP md5.

Here is the equivalent in .NET.

...
var passphrase = Encoding.UTF8.GetBytes("asdfghjkl");
var salt = Encoding.UTF8.GetBytes("123456789");
var salted = new List<byte>();
var dx = new byte[0];
using (var md5 = MD5.Create())
{
    do
    {
        var bytesToHash = dx.Concat(passphrase).Concat(salt);
        dx = md5.ComputeHash(bytesToHash.ToArray());
        salted.AddRange(dx);
    } while (salted.Count < 48);
}

var key = salted.Take(32).ToArray();
var iv = salted.Skip(32).Take(16).ToArray();
...

If you want to check the outputs, use the PHP base64_encode function and the .NET Convert.ToBase64String, then compare the base64 strings.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement