Реализация SHA 1 в PHP и .Net - PullRequest
       14

Реализация SHA 1 в PHP и .Net

1 голос
/ 29 января 2012

Я работаю над проектом (на основе PHP), в котором мне нужно вычислить SHA1, я использую эту строку кода для генерации SHA1 в PHP.

$da = file_get_contents("payload.txt");
echo sha1($da);

и это код для .Net

private static string GetSHA1(string text)
        {
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] hashValue;
            byte[] message = UE.GetBytes(text);

            SHA1Managed hashString = new SHA1Managed();
            string hex = "";

            hashValue = hashString.ComputeHash(message);
            foreach (byte x in hashValue)
            {
                hex += String.Format("{0:x2}", x);
            }
            return hex;
        }

Но я запутался, потому что оба языка дают разные результаты, я не даю соли в обоих из них (так как я не знаю, что использовать в соли, потому что API не определил это)

После этого мне также нужно работать на RSA (у меня есть ключ для шифрования) Также может кто-нибудь сказать, эти алгоритмы отличаются из-за языков или чего-то, что мне не хватает ???

Нужны мнения экспертов по этому вопросу

это весь алгоритм генерации шифрования SHA1 и RSA

<?php
class MyEncryption
{

    public $pubkey = '...public key here...';
    public $privkey = '...private key here...';

    public function encrypt($data)
    {
        if (openssl_private_encrypt($data, $encrypted, $this->pubkey))
            $data = base64_encode($encrypted);
        else
            throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?');

        return $data;
    }

    public function decrypt($data)
    {
        if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey))
            $data = $decrypted;
        else
            $data = '';

        return $data;
    }
}

$enc = new MyEncryption();
$enc->pubkey = file_get_contents("server.key");
$payload = file_get_contents("payload1.txt");//payload1.txt contain xml data
$hashRes = sha1($payload,true);
echo $enc->encrypt($hashRes);


?>

Большое спасибо

Ответы [ 2 ]

5 голосов
/ 29 января 2012

Это ваш UnicodeEncoding.PHP ничего не знает о кодировках, поэтому ваша строка просто содержит все байты, которые делает файл, 1: 1.Однако в .NET, если вы читаете файл как текст, он примет некоторую кодировку (обычно UTF-8, если не указано иное), а затем преобразует его во внутреннее представление, и в конце концов вы конвертируете его в UTF.-16 и хеш этих байтов - которые, вероятно, не имеют ничего общего с оригиналом на всех байтах, если оригинал также не был UTF-16.И даже если бы это был UTF-16, он мог бы включать метку порядка байтов, чего нет у UnicodeEncoding.GetBytes().И даже если этого не произойдет, исходная строка, возможно, не была нормализована, и вы могли бы нормализовать ее где-то по пути (вы не покажете нам код, где вы ее читали), и байты снова будут другими.И т. Д.

Правильный подход состоит в том, чтобы прочитать весь файл как двоичный блок байтов (например, с System.IO.File.ReadAllBytes()), а затем напрямую хешировать эти байты.Нет необходимости включать какие-либо текстовые кодировки и преобразования.И тогда хеш должен совпадать.

1 голос
/ 29 января 2012

Вы пробовали sha1 (данные, правда)?В противном случае он будет генерировать шестнадцатеричные числа.Вы также можете использовать hex2bin (sha1 (data)), если он недоступен на вашей платформе.Кроме того, UnicodeEncoding может использовать 2 байта в качестве кодировки вместо одного (для символов, которые также находятся в ASCII).Попробуйте вместо этого кодирование UTF8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...