[英]Convert code to C#?
我转换此代码:
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])));
它不起作用。 我需要从两种语言获得相同的输出。 如何将字符串(“ bbb”)正确转换为C#语言的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 = "A91A64DD4DF1880651CB6B919BE02C4363ED6D4B07EA246CF47FFB509918E4AA4C294FF8BA9F73E5CD1CE463BB3E66F84A6C294D70C781CD0610345BCADEEDA7";
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
因此,您可能不走运。 我目前看不到要尝试的其他方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.