0
<?php 
$pwd = "test"; 
$crypted = base64_encode(pack("H*", sha1(utf8_encode($pwd)))); 
echo("$crypted"); 
?>

上記の 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;
            }

またはさらに簡単

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

1 に答える 1

3

PHP バージョンではpack、base64 エンコーディングの前に、SHA1 関数の出力でも呼び出しているようです。

PHP のバージョンを正しく解釈すると、基本的に最初に SHA1 ハッシュの出力を 16 進エンコードし、次に 16 進エンコードされた文字列を Base64 エンコードします。これは、SHA1 ハッシュの出力を直接 Base64 エンコードするのとは異なります。 C#バージョンで何が起こっている..

于 2013-03-10T17:31:25.493 に答える