将C#MD5哈希复制到PHP

时间:2013-02-17 03:51:24

标签: c# php md5

我必须将下面的代码中的C#哈希复制到PHP中。我一直在寻找,但到目前为止找不到解决方案。

来自this article on creating an md5 hash string

using System;
using System.Text;
using System.Security.Cryptography;

// Create an md5 sum string of this string
static public string GetMd5Sum(string str)
{
    // First we need to convert the string into bytes, which
    // means using a text encoder.
    Encoder enc = System.Text.Encoding.Unicode.GetEncoder();

    // Create a buffer large enough to hold the string
    byte[] unicodeText = new byte[str.Length * 2];
    enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);

    // Now that we have a byte array we can ask the CSP to hash it
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] result = md5.ComputeHash(unicodeText);

    // Build the final string by converting each byte
    // into hex and appending it to a StringBuilder
    StringBuilder sb = new StringBuilder();
    for (int i=0;i<result.Length;i++)
    {
        sb.Append(result[i].ToString("X2"));
    }

    // And return it
    return sb.ToString();
}

对于input =“123”,上面的代码给出了“5FA285E1BEBE0A6623E33AFC04A1FBD5”

我尝试过以下PHP代码,但它没有提供相同的输出。

来自SO问题PHP MD5 not matching C# MD5

$str = "123";
$strUtf32 = mb_convert_encoding($str, "UTF-32LE");
echo md5($strUtf32);

此代码的结果为“a0d5c8a4d386f15284ec25fe1eeeb426”。顺便说一下,将UTF-32LE改为utf-8或utf-16仍然不会给我相同的结果。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

是的,正如CodesInChaos所说,你的编码错了。

在php端试试这个:

$str = "123";
$strUtf32 = mb_convert_encoding($str, "UTF-16LE");
echo md5($strUtf32);

这会给你5FA285E1BEBE0A6623E33AFC04A1FBD5。这将匹配c#侧的System.Text.Encoding.Unicode

否则请在c#端将System.Text.Encoding.Unicode更改为System.Text.Encoding.UTF32。这将为您提供A0D5C8A4D386F15284EC25FE1EEEB426

答案 1 :(得分:0)

呃,C#代码创建一个MD5哈希,而PHP mb_convert_encoding函数只是对字符串进行编码...

另外,这不是您提供的链接的完整代码。您缺少重要的MD5功能:

$str = "123";
$strUtf32 = mb_convert_encoding($str, "UTF-16");
echo md5($strUtf32); <=====

如果该代码匹配,则应该没有原因,为什么这不起作用,因为MD5算法仍然相同,并且不会因语言而异。