c# - 将代码转换为 C#?

标签 c# php hash utf sha512

我转换此代码:

strtoupper(bin2hex(mhash(mhash_sha512, "$ico{$product[0]}{$user[1]}")));

进入 C#:

byte[] data = SHA512.Create().ComputeHash(Encoding.ASCII.GetBytes(args[0]));
string result = "";
for(int index = 0; index < data.Length; index++)
    result += data[index].ToString("X2");

而且效果非常好。但如果我尝试将输入转换为 UTF16:

strtoupper(bin2hex(mhash(mhash_sha512, iconv('UTF-8', 'UTF-16', "$ico{$product[0]}{$user[1]}"))));

在 C# 中使用 Encoding 类进行转换:

SHA512.Create().ComputeHash(Encoding.Convert(Encoding.ASCII/UTF8, Encoding.GetEncoding("UTF-16"), Encoding.ASCII/UTF8.GetBytes(args[0])));

它不工作。我需要从两种语言获得相同的输出。如何在 C# 语言中正确地将字符串(“bbb”)转换为 UTF16?谢谢...

最佳答案

如果是小端 UTF-16 编码,则将 Encoding.GetEncoding("UTF-16") 更改为 Encoding.Unicode 如果是大端 UTF-16 ,将其更改为“Encoding.BigEndianUnicode”。

经过进一步检查(例如 UTF-8 与 Encoding.ASCII 不同),这是否是 PHP 代码的良好翻译?

var bytesToHash = Encoding.Convert(Encoding.UTF8, Encoding.BigEndianUnicode, Encoding.UTF8.GetBytes(args[0]));
var result = string.Concat(SHA512.Create().ComputeHash(bytesToHash).Select(b => b.ToString("X2")));

我不熟悉这个 php mhash 函数的预期输出,但也许你可以尝试这个:

var hash = new System.Security.Cryptography.SHA512CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(data));
var hashString = BitConverter.ToString(hash);
var phpLikeHash = hashString.Replace("-", String.Empty).ToUpper();

更新 好的,根据您的新信息,如果不需要输入的编码转换,我包含的第一个示例将起作用。因此,这至少证实了我们可以依靠 SHA512 以您使用 PHP 的 mhash 的方式生成相同的输出,并且任何差异都与作为输入提供的字节有关。

我建议您使用相同的文字字符串作为 PHP 代码和 C# 中的输入来尝试不同的编码。就像例如如下:

    static bool HashIt(Encoding source, Encoding dest, string input, string expectedOutput)
    {
        byte[] bytes = source.GetBytes(input);
        if (source != dest && dest != null)
            bytes =  Encoding.Convert(source, dest, bytes);
        var hash = SHA512.Create().ComputeHash(bytes);
        var hashString = string.Concat(hash.Select(b => b.ToString("X2")));
        if (hashString.Equals(expectedOutput))
        {
            Console.WriteLine("Match found");
            Console.WriteLine("Source encoding: {0}", source.WebName);
            if (source != dest && dest != null)
                Console.WriteLine("Converted to: {0}", dest.WebName);
            return true;
        }
        return false;
    }

    static void Main(string[] args)
    {
        var inputs = new [] { "13338170AS875HEO49F8Sam-PC", @"13338170AS875HEO49F8Sam-PC" };
        var expectedOutput = "A91A64DD4DF1880651CB6B919BE02C4363ED6D4B07EA246CF47FFB509918E4AA4C294FF8BA9F73E5‌​CD1CE463BB3E66F84A6C294D70C781CD0610345BCADEEDA7";
        var encodings = Encoding.GetEncodings().Select(e => e.GetEncoding());
        var matchFound = false;
        foreach (var srcEncoding in encodings)
        {
            foreach (var input in inputs)
            {
                if (HashIt(srcEncoding, null, input, expectedOutput))
                    matchFound = true;
                foreach (var destEncoding in encodings)
                {
                    if (HashIt(srcEncoding, destEncoding, input, expectedOutput))
                        matchFound = true;
                }
            }
        }
        if (!matchFound)
            Console.WriteLine("No matches found");
        Console.ReadLine();
    }

这会在我的系统上产生以下输出:

No matches found

所以你可能不走运。我目前不知道还能尝试什么。

关于c# - 将代码转换为 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281554/

相关文章:

linux - 是否可以检查 ELF 可执行文件的 "GNU_HASH"部分中的哈希值?

PHP/MySQL : What data type to chose for encrypted passwords (bcrypt, 最大。 100 个字符)

c# - 我可以使用递归约束来定义泛型类吗

c# - 如何延迟以及如何仅在 c# 的 Debug模式下启动函数?

hash - 哈希结果是否与源值相同?

java - 确保恶意 apk 没有与我的服务器通信

PHP mb_substr 划分错误 utf 8

c# - 使用C#在html文档中抓取JavaScript动态生成的数据

c# - Windows7 中的 CefSharp 问题

php - 拉维尔 5.6 : Create schema in database