Q:

hash_hmac метод в c#

Пытаюсь найти аналог функции hash_hmac('sha512'.. для с#. Нашел следующий код
var rez= Hash("privet", GetBytes(12345));

в с# получается результат Nzg3OGNmMmJhZGRiOTM4NTY1NTc4MjgwOGE3ZDNlNDFlMDBhNTBkMGY1NWFhMzJlM2RiNDkxZTUwMjQ5ODZkOTUwMWUyOWU0YzY1YTNlY2UwYzI0N2VmZGI5NmMxZjVlNGEwOTdhMGJlYmI2YzFlYTk1MmZjYjM5YWY0M2RlZTY=
А в php 
$sign = hash_hmac('sha512', 'privet', '12345');
f7ff9475713b9ec97b4042502e472e9c081bcd5ae6ae419ad7f3603933e772fb29cb51599964643fe5f16cc692a2be7410878f5a76d1570947f570c26e0cc8f8
Где я ошибся, друзья?
private string Hash(string message, byte[] secretKey)
{
    byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(message);
    byte[] hashBytes;
    using (HMACSHA512 hmac = new HMACSHA512(secretKey))
    {
        hashBytes = hmac.ComputeHash(msgBytes);
    }
    var sb = new StringBuilder();
    for (int i = 0; i < hashBytes.Length; i++)
        sb.Append(hashBytes[i].ToString("x2"));
    string hexString = sb.ToString();
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(hexString);
    return System.Convert.ToBase64String(toEncodeAsBytes);
}

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

A:

Используйте обычный Encoding.GetBytes для получения байт ключа. И выводите результат hexString как есть, а не энкодьте его байты еще раз как base64. Вот рабочий вариант, который дает тот же результат, что у вас в PHP:
private static string Hash(string message, string secretKey)
{
    var encoding = System.Text.Encoding.UTF8;
    byte[] msgBytes = encoding.GetBytes(message);
    var keyBytes = encoding.GetBytes(secretKey);
    using (HMACSHA512 hmac = new HMACSHA512(keyBytes))
    {
        byte[] hashBytes = hmac.ComputeHash(msgBytes);

        var sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
            sb.Append(hashBytes[i].ToString("x2"));
        return sb.ToString();
    }
}

static void Main(string[] args)
{
    Console.WriteLine(Hash("privet", "12345"));
}

