ejemplo desencriptar c# hmac sha512

desencriptar - C#equivalente a hash_hmac en PHP



sha256 c# implementation (3)

Como se dijo anteriormente, el problema fue con el paquete PHP (función H * utilizada para convertir la clave en una matriz de bytes. C # Getbytes no da el mismo resultado (utf8, asci, unicode ...). La solución se encuentra aquí: nuronconsulting.com/c-pack-h.aspx estaba bien para mí. ¡Ahora HMAC de C # coincide con PHP!

public static byte[] PackH(string hex) { if ((hex.Length % 2) == 1) hex += ''0''; byte[] bytes = new byte[hex.Length / 2]; for (int i = 0; i < hex.Length; i += 2) { bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); } return bytes; }

Gracias Manu a todos por vuestra ayuda.

usando .NET y C # necesito proporcionar una cadena de integridad usando HMAC SHA512 a un servidor PHP. Usando en C #:

Encoding encoding = Encoding.UTF8; byte[] keyByte = encoding.GetBytes(key); HMACSHA512 hmacsha512 = new HMACSHA512(keyByte); byte[] messageBytes = encoding.GetBytes(message); byte[] hashmessage = hmacsha512.ComputeHash(messageBytes); return(ByteToString(hashmessage).toUpper());

Pero no coincide con el código PHP hash_hmac () PHP:

$hmac = strtoupper(hash_hmac($pbx_hash, $msg, $binKey));

Intento cambiar la codificación en C # (utf8, ASCII, Unicode) sin éxito.

He intentado muchas soluciones encontradas en la red pero nada da la misma cadena :(

No puedo cambiar el código PHP y no veo lo que está mal en C #

Editar Esto es ByteToString (copiado del comentario):

static string ByteToString(byte[] buff) { string sbinary = ""; for (int i = 0; i < buff.Length; i++) { sbinary += buff[i].ToString("X2"); /* hex format */ } return (sbinary); }

Después de muchos tets, encontré que obtengo los mismos resultados si la clave de hash_hmac de PHP es una cadena, no una matriz de bytes. Parece que el problema es con la función de conversión de PHP $ binKey = pack ("H *", $ keyTest);


El problema debe ser la representación real de los datos clave / mensaje.

Vea las siguientes pruebas:

PHP

#!/usr/bin/php <?php print strtoupper(hash_hmac("sha256", "message", "key")); ?>

Salida (en vivo a través de http://writecodeonline.com/php/ ):

6E9EF29B75FFFC5B7ABAE527D58FDADB2FE42E7219011976917343065F58ED4A

C#

using System; using System.Text; using System.Security.Cryptography; public class Program { private const string key = "key"; private const string message = "message"; private static readonly Encoding encoding = Encoding.UTF8; static void Main(string[] args) { var keyByte = encoding.GetBytes(key); using (var hmacsha256 = new HMACSHA256(keyByte)) { hmacsha256.ComputeHash(encoding.GetBytes(message)); Console.WriteLine("Result: {0}", ByteToString(hmacsha256.Hash)); } } static string ByteToString(byte[] buff) { string sbinary = ""; for (int i = 0; i < buff.Length; i++) sbinary += buff[i].ToString("X2"); /* hex format */ return sbinary; } }

Salida (en vivo a través de http://ideone.com/JdpeL ):

Result: 6E9EF29B75FFFC5B7ABAE527D58FDADB2FE42E7219011976917343065F58ED4A

Por lo tanto, verifique el conjunto de caracteres / codificación de los datos de entrada de PHP. También verifique el algoritmo real (en $pbx_hash ).


private static string HashHmac(string message, string secret) { Encoding encoding = Encoding.UTF8; using (HMACSHA512 hmac = new HMACSHA512(encoding.GetBytes(secret))) { var msg = encoding.GetBytes(message); var hash = hmac.ComputeHash(msg); return BitConverter.ToString(hash).ToLower().Replace("-", string.Empty); } }