PHP MD5与C#MD5不匹配

Jes*_*sse 1 php c# cryptography

我在C#中有一个哈希方法,看起来像:

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] raw_input  = Encoding.UTF32.GetBytes("hello");
byte[] raw_output = md5.ComputeHash(raw_input);

string output = "";
foreach (byte myByte in raw_output)
    output += myByte.ToString("X2");

return output;
Run Code Online (Sandbox Code Playgroud)

我怎样才能在PHP中实现它?执行以下操作会生成不同的哈希摘要...

$output = hash('md5', 'hello');
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

您需要找出PHP用于将字符串转换为文本的编码.这是非常不可能的,它使用UTF-32.它可能使用平台默认编码,或者可能使用UTF-8.

using (MD5 md5 = MD5.Create())
{
    byte[] input = Encoding.UTF8.GetBytes("hello");
    byte[] hash = md5.ComputeHash(input);
    return BitConverter.ToString(hash).Replace("-", "");
}
Run Code Online (Sandbox Code Playgroud)

(这是语言/平台的问题,它将字符串视为二进制数据 - 它不清楚发生了什么.这里必须转换为字节,因为MD5是为字节定义的,而不是Unicode在C#代码中,你明确地这样做了......在PHP中它隐含且记录不完整.)

编辑:如果你必须改变PHP,你可以试试这个:

$text = mb_convert_encoding($text, "UTF-32LE");
$output = md5($text)
Run Code Online (Sandbox Code Playgroud)

这取决于PHP是否支持UTF-32 ...


huy*_*itw 5

PHP

此 PHP 代码将执行以下操作:

<?php
$str = "admin";
$strUtf32 = mb_convert_encoding($str, "UTF-32LE");
echo md5($strUtf32);
?>
Run Code Online (Sandbox Code Playgroud)

此代码输出“1e3fcd02b1547f847cb7fc3add4484a5”