MZH*_*MZH 1 .net php encryption encoding character-encoding
我正在开发一个项目(基于PHP),我需要在其中计算SHA1,我正在使用这行代码在PHP中生成SHA1.
$da = file_get_contents("payload.txt");
echo sha1($da);
Run Code Online (Sandbox Code Playgroud)
这是.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;
}
Run Code Online (Sandbox Code Playgroud)
但我很困惑,因为两种语言都会产生不同的结果,我不会在它们两者中提供任何盐(因为我不知道在盐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);
?>
Run Code Online (Sandbox Code Playgroud)
非常感谢
这是你的UnicodeEncoding.PHP对编码一无所知,因此您的字符串只包含文件执行的所有字节,1:1.但是在.NET中,如果您将文件作为文本读取,它将采用一些编码(通常是UTF-8,如果您没有另外指定),然后将其转换为内部表示,最后将其转换为UTF -16并散列那些字节 - 除非原始字母也是UTF-16,否则它们可能与原始字节完全不同.即使它是UTF-16,它也可能包含Byte-Order-Mark,UnicodeEncoding.GetBytes()但不包括.即使它没有,原始字符串可能没有被标准化,并且你可能已经在它的某个地方对它进行了规范化(你没有向我们展示你读取它的代码),并且字节将再次不同.等等.
正确的方法是将整个文件读取为二进制字节块(例如,with System.IO.File.ReadAllBytes()),然后直接对这些字节进行哈希处理.无需涉及任何文本编码和转换.然后哈希应该匹配.
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |