c # — функция sha1, дающая другой результат эквивалентного кода .net

У меня есть следующий код PHP:

$stringToHash = "10123456789"."2014:11:25-15:42:00"."20.00"."826"."sharedsecret";

echo($stringToHash);
// outputs:
// 101234567892014:11:25-15:42:0020.00826sharedsecret

$ascii = bin2hex($stringToHash);

echo($ascii);
// outputs:
// 3130313233343536373839323031343a31313a32352d31353a34323a303032302e3030383236736861726564736563726574

$sha = sha1($ascii);

echo($sha);
// outputs:
// 847aa9da32c54ed8bb9183007336f5762a62ef20

Вот эквивалентный код C #:

var stringToHash = "10123456789" + "2014:11:25-15:42:00" + "20.00" + "826" + "sharedsecret";

Console.WriteLine(stringToHash);
// outputs:
// 101234567892014:11:25-15:42:0020.00826sharedsecret

var bytes = Encoding.ASCII.GetBytes(stringToHash);

var hexString = BitConverter.ToString(bytes).Replace("-", string.Empty);

Console.WriteLine(hexString);
// outputs:
// 3130313233343536373839323031343A31313A32352D31353A34323A303032302E3030383236736861726564736563726574

SHA1 sha = new SHA1CryptoServiceProvider();
var password = sha.ComputeHash(bytes);
var result = BitConverter.ToString(password).ToLower().Replace("-", string.Empty);

Console.WriteLine(result);
// outputs:
// c8069048623d6b98a08454e43e1a02a42cf7d61d

var hexStringBytes = Encoding.ASCII.GetBytes(hexString);
var hexStringPassword = sha.ComputeHash(hexStringBytes);
var hexStringResult = BitConverter.ToString(hexStringPassword).ToLower().Replace("-", string.Empty);

Console.WriteLine(hexStringResult);
// outputs:
// bd857ca08446001f7182fbbbd41e747abe302a87

Первые два выхода одинаковы. Исходные строки идентичны, как и шестнадцатеричные массивы ASCII после преобразования, но sha1 () в PHP дает мне другой результат .NET SHA1CryptoServiceProvider. Если я преобразую этот вывод в строку и снова хеширую, результат также будет другим.

В .net объект должен быть в форме байтового массива, прежде чем вы сможете создать из него хеш SHA, и я не понимаю, что мне нужно преобразовать в байтовый массив для получения того же вывода, что и код PHP ,

Это проблематично, так как сторонний сервис, который я публикую, использует версию PHP для проверки объекта на их конце, а моя программа написана на .net. Я мог бы написать посредника на PHP и передать через него, но я действительно не хочу этого делать.

Любое понимание того, почему эти два дают разные результаты? Спасибо

0

Решение

Это сделает это. Вдохновленный этим сообщение и вопрос, на который я наткнулся 2 дня назад и не могу найти.

public string HashItThePHPWay(string hashMe)
{
var sha = new SHA1CryptoServiceProvider();
string b64 = ByteArrayToString(Encoding.ASCII.GetBytes(hashMe));
var b64Bytes = Encoding.ASCII.GetBytes(b64);
var result = sha.ComputeHash(b64Bytes);
return BitConverter.ToString(result).Replace("-", "").ToLower();
}

public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
{
hex.AppendFormat("{0:x2}", b);
}
return hex.ToString().ToLower();
}
3

Другие решения

Других решений пока нет …