Почему я получаю другое значение ha sh при работе с python и C# с одним и тем же ключом и сообщением? - PullRequest
0 голосов
/ 27 марта 2020

Это отчасти сводит меня с ума. У меня есть этот код в C#, который я пытаюсь перевести на python, но по какой-то причине я не могу получить тот же ха sh.

using System.Text;
using System.Security.Cryptography;

public class Program
{
    public static void Main()
    {
        // input, plain text here
        string key = "8ea79bcec3d54597efe186780a835c075400623a11481d3d17dd92e905dbb615";
        string tokenHash = "st=1585258906~exp=1585261006~acl=*";
        string encoded;
        HMACSHA256 hmac = new HMACSHA256(ParseHexBinary(key));
        byte[] bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(tokenHash.ToString()));
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.Length; i++)
        {
            sb.Append(bytes[i].ToString("x2"));
        }

        encoded = sb.ToString();
        Console.WriteLine(encoded);
    }
    private static int HexToBinFn(char c)
        {
            if ('0' <= c && c <= '9')
            {
                return c - '0';
            }
            char c2 = 'A';
            if ('A' > c || c > 'F')
            {
                c2 = 'a';
                if ('a' > c || c > 'f')
                {
                    return -1;
                }
            }
            return (c - c2) + 10;
        }

        public static byte[] ParseHexBinary(String str)
        {
            int length = str.Length;
            byte[] bytes = new byte[(length / 2)];

                for (int i = 0; i < length; i += 2)
                {
                    int bin1 = HexToBinFn(str[i]);
                    int bin2 = HexToBinFn(str[i + 1]);

                    int i2 = (bin1 * 16) + bin2;
                    byte b = (byte)i2;

                    bytes[i / 2] = b;
                }

            return bytes;
        }
}

с C# I получить это га sh: 988b6a86f25529ad8a8c2da42bf95a0ca24ea113fb05fcb6e356096852693dda

1005 * Это python код у меня есть:
import hashlib
import hmac
import base64

key = '8ea79bcec3d54597efe186780a835c075400623a11481d3d17dd92e905dbb615'
tokenHash = 'st=1585258906~exp=1585261006~acl=*'
x = hmac.new(key.encode('utf-8'), tokenHash.encode('utf-8'), hashlib.sha256).hexdigest()

С python Я получаю это га sh: 8cbb2096d5e201454bb6797b4689a524d2d7d1def51c4b66ec6b1e4a99a509cf

1010 * Может кто-нибудь сказать мне, пожалуйста, где разница? Я не могу понять, как это перевести. Спасибо большое.

1 Ответ

1 голос
/ 27 марта 2020

Я не знаю, что python делает с string, который вы предоставляете в качестве ключа к методу hmac.new, но он, похоже, не преобразует гекс в байты, и именно поэтому вы получаете разные хеши. Если я сначала конвертирую гекс в байты в python, то они оба производят одинаковое ха sh.

import hashlib
import hmac
import base64
import binascii

key = '8ea79bcec3d54597efe186780a835c075400623a11481d3d17dd92e905dbb615'
keyBytes = binascii.unhexlify(key)
tokenHash = 'st=1585258906~exp=1585261006~acl=*'
x = hmac.new(keyBytes, tokenHash.encode('utf-8'), hashlib.sha256).hexdigest()

Таким образом, может показаться, что они не производят одинаковое ха sh потому что ключ другой.

Если вы не можете изменить код python, тогда в C# вместо обработки key как шестнадцатеричной строки и преобразования ее в byte[] вы просто получите UTF8 байт. из строки тогда они производят тот же ха sh. Для меня, по крайней мере.

//var keyBytes = ParseHexBinary(key); Instead of this...
var keyBytes = Encoding.UTF8.GetBytes(key); //Do this.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...