C#代码php相当于md5哈希

时间:2016-05-25 13:39:16

标签: c# php

我有这个C#代码:

$a = "test";
$a = mb_convert_encoding($a, "UTF-16LE");
$a = md5($a);
echo $a;

在这里你可以看到一个online version。你可以看到字符串" test"我得到了输出" 5c82e9e41c7599f790ef1d774b7e6bf" 这就是我在php端尝试的内容

char

但是php代码的价值是" c8059e2ec7419f590e79d7f1b774bfe6"。为什么不工作?

编辑:看起来C#代码不正确,需要更换

4 个答案:

答案 0 :(得分:4)

' test'正确的MD5哈希值是' 098f6bcd4621d373cade4e832627b4f6'用PHP。

我用C#

中的代码测试了它
   public static string CreateMD5(string input)
    {
        // Use input string to calculate MD5 hash
        using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
        {
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            // Convert the byte array to hexadecimal string
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }

它将生成与PHP相同的哈希值,而不使用&#39;转换编码&#39;你正在使用的方法。

答案 1 :(得分:2)

我认为转换编码会给你一个不同的答案,不用尝试就可以了。

$a = mb_convert_encoding($a, "UTF-16LE");

答案 2 :(得分:1)

问题是您在C#代码中错误地转换结果。如果您在致电ComputeHash后在代码中添加了断点,并检查byteHashValue的值,则会看到它是c8059e2e...

或者,只需将此代码添加到ComputeHash方法:

Console.WriteLine(BitConverter.ToString(byteHashValue));

我建议将代码重写为:

    public static string Encript(string strData)
    {
        string hashValue = HashData(strData);
        return hashValue;
    }

    public static string HashData(string textToBeEncripted)
    {
        //Convert the string to a byte array
        Byte[] byteDataToHash = System.Text.Encoding.Unicode.GetBytes(textToBeEncripted);

        //Compute the MD5 hash algorithm
        Byte[] byteHashValue = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(byteDataToHash);

        return BitConverter.ToString(byteHashValue).Replace("-", "");
    }

哦,还有旁注:这个词是“加密”,而不是“Encript。”

答案 3 :(得分:1)

您的案例中的问题不是编码,而是您在C#端转换为字符串。只要您在任何地方使用相同的编码,它应该按预期工作。但请注意,大多数在线哈希都使用ASCII编码,而您使用的是System.Text.Encoding.Unicode UTF-16,因此结果将与在线编码器不同。

以下代码将提供与PHP代码段相同的结果(即c8059e2ec7419f590e79d7f1b774bfe6

public static void Main(string[] args)
{
    string a = "test";
    string en = HashData(a);
    Console.WriteLine(en);
}

public static string HashData(string textToBeEncripted)
{
    Byte[] byteDataToHash = System.Text.Encoding.Unicode.GetBytes(textToBeEncripted);
    Byte[] byteHashValue = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(byteDataToHash);
    System.Text.StringBuilder s = new System.Text.StringBuilder();
    foreach (var b in byteHashValue)
        s.Append(b.ToString("x2"));
    return s.ToString();

}

如果您使用System.Text.Encoding.ASCII,则会按照其他答案中的建议获得098f6bcd4621d373cade4e832627b4f6。但是,您还必须在PHP代码中使用ASCII编码。

这是因为对于UTF16,每个字符由两个字节表示,而不仅仅由一个字节表示。因此,byteDataToHash的大小将是原来的两倍([116, 0, 101, 0, 115, 0, 116, 0] vs [116, 101, 115, 116]。当然,不同的字节向量会导致不同的哈希值。但如上所述,只要所有包含的组件使用相同的编码,使用哪一个并不重要。