1

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

这篇关于创建 md5 哈希字符串的文章

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();
}

对于输入=“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 仍然不会给我相同的结果。

任何人都可以帮忙吗?

4

2 回答 2

2

是的,正如 CodesInChaos 建议的那样,您的编码错误。

在 php 方面试试这个:

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

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

否则更改System.Text.Encoding.UnicodeSystem.Text.Encoding.UTF32c# 端。这会给你A0D5C8A4D386F15284EC25FE1EEEB426

于 2013-02-17T04:40:11.407 回答
0

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

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

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

如果该代码匹配,则应该没有理由为什么它不应该工作,因为 MD5 算法仍然是相同的,并且不会因语言而异。

于 2013-02-17T03:53:09.317 回答