PHP和.Net中的SHA 1实现

时间:2012-01-29 14:32:18

标签: php .net encryption encoding character-encoding

我正在开发一个项目(基于PHP),我需要在其中计算SHA1,我正在使用这行代码在PHP中生成SHA1。

$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;
        }

但我很困惑,因为两种语言都会产生不同的结果,我不会在它们中提供任何盐(因为我不知道在盐b / c中使用什么,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 个答案:

答案 0 :(得分:5)

这是你的UnicodeEncoding。 PHP对编码一无所知,因此您的字符串只包含文件执行的所有字节,1:1。但是在.NET中,如果您将文件作为文本读取,它将采用一些编码(通常是UTF-8,如果您没有另外指定),然后将其转换为内部表示,最后将其转换为UTF -16和hash 那些字节 - 除非原始字母也是UTF-16,否则它们可能与原始字节完全不同。即使它是UTF-16,它也可能包含了字节顺序标记,UnicodeEncoding.GetBytes()没有。即使它没有,原始字符串可能没有被标准化,并且你可能已经在它的某个地方对它进行了规范化(你没有向我们展示你读取它的代码),并且字节将再次不同。等

正确的方法是将整个文件读取为二进制字节块(例如,使用System.IO.File.ReadAllBytes()),然后直接对这些字节进行散列。无需涉及任何文本编码和转换。然后哈希应该匹配。

答案 1 :(得分:1)

你试过sha1(数据,真)?否则它将生成十六进制。如果您的平台上没有hex2bin(sha1(数据)),也可以使用它。此外,UnicodeEncoding可以使用2个字节作为编码而不是一个(对于也是ASCII的字符)。请尝试使用UTF8编码。