2013-03-10 243 views
1
<?php 
$pwd = "test"; 
$crypted = base64_encode(pack("H*", sha1(utf8_encode($pwd)))); 
echo("$crypted"); 
?> 

因此,我得到了上面这个PHP代码,我试图将它转换为C#代码。我试过以下,但它没有相同的输出。将PHP代码转换为C#代码

var bytes = Encoding.UTF8.GetBytes("test"); 
      SHA1 sha = new SHA1CryptoServiceProvider(); 
      var result = sha.ComputeHash(bytes); 
      string hex = Encoding.UTF8.GetString(result, 0, result.Length); 
      byte[] packH = PackH(hex); 
      var base64String = Convert.ToBase64String(packH); 

和方法:

public static byte[] PackH(string hex) 
     { 
      if ((hex.Length % 2) == 1) hex += '0'; 
      var bytes = new byte[hex.Length/2]; 
      for (int i = 0; i < hex.Length; i += 2) 
      { 
       bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
      } 
      return bytes; 
     } 

因为我没有足够的信誉来回答我的问题,我将在这里写下了答案:d

It seems that i needed to do some extra things:D 

    public static string Crypt(string data) 
      { 
       SHA1 sha = new SHA1Managed(); 
       byte[] buffer = Encoding.UTF8.GetBytes(data); 
       byte[] computeHash = sha.ComputeHash(buffer); 

       string delimitedHexHash = BitConverter.ToString(computeHash); 
       string hexHash = delimitedHexHash.Replace("-", ""); 
       byte[] packH = PackH(hexHash); 
       return Convert.ToBase64String(packH); 
      } 

      public static byte[] PackH(string hex) 
      { 
       if ((hex.Length%2) == 1) hex += '0'; 
       var bytes = new byte[hex.Length/2]; 
       for (int i = 0; i < hex.Length; i += 2) 
       { 
        bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
       } 
       return bytes; 
      } 

甚至easyier

Console.WriteLine(Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes("root")))); 
+5

为什么不开始比较逐步比较值,并确切地看到什么失败? – Tchoupi 2013-03-10 17:32:17

+0

看起来你没有实现一个等效的包函数,也许这将有助于:http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/ca080d6e-0707-4030-a3c7-462d5903b5f8 – Mark 2013-03-10 17:34:37

回答

3

它看起来像在PHP版本中,在你使用base64编码之前,你也在SHA1函数的输出上调用pack

如果我正确解释PHP版本,您基本上首先对SHA1哈希的输出进行十六进制编码,然后对Base编码的十六进制编码的字符串进行编码 - 这与Base64编码SHA1的输出不同直接散列这是在C#版本中发生的事情。

+1

那么,对不起,这是一个错字,但仍然不起作用 – 2013-03-10 17:34:19

+1

+1很好的答案:p – Tchoupi 2013-03-10 17:46:03

+0

谢谢..你的评论是现货! – 2013-03-10 17:47:17