我正在开发一个项目(基于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);
?>
非常感谢
答案 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编码。