Преобразование Python в C # SHA1 - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть следующий фрагмент кода Python, который я пытаюсь преобразовать в C #.Результат реализации C # отличается от Python.Кто-нибудь может объяснить, что делает этот код, пожалуйста?Есть предложения по конвертации в C #?

Ввод: user@me.com

Код Python:

def encode_username(u):
    d = hashlib.sha1(u).digest()
    return base64.b32encode(d).lower()

Результат: '2hg7ic5ttw4cgfo5kfnjhtqwbq73l6rl'

Мой код C #:

    string EncodeUsername(string username)
    {
        var sh = SHA1.Create();
        var bytes = sh.ComputeHash(Encoding.Default.GetBytes(username));
        return Base32.ToBase32String(bytes);
    }

Результат: 'D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B'

Ссылка Base32: http://www.atrevido.net/blog/PermaLink.aspx?guid=debdd47c-9d15-4a2f-a796-99b0449aa8af

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Код, который вы связали с atrevido.net, не может сгенерировать вывод, который вы описали (D1CD...), так как этот код вообще не использует символ 1 (см. Его константу ValidChars, которая использует очень нестандартная карта символов base32, и среди прочего не хватает 1 и 0).

На самом деле, строка вывода, которую вы дали для C #, содержит только символы 0-9A-F, что делает меня шестнадцатеричным.Продолжая, вывод Python hashlib.sha1('user@me.com').hexdigest().upper() на самом деле является строкой, которую вы получили от C # ... D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B.

Так что проблема в том, что любой код, который вы используете в .Net, неделать кодирование base32 любого типа, но base16 / шестнадцатеричный.Вы захотите использовать hex под python или реальную реализацию base32 под .Net.

(Также, как и другие предлагали, вы должны использовать Encoding.UTF8.GetBytes, иначе вы получите противоречивое поведение на разных компьютерах).

1 голос
/ 01 февраля 2012

C #

private static SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();

private static string CalculateSHA1(string text, Encoding enc)
{
    byte[] buffer = enc.GetBytes(text);
    return BitConverter.ToString(SHA.ComputeHash(buffer)).Replace("-", "");
}

Python

def encode_username(u):
return hashlib.sha1(u.encode('utf-8'));
1 голос
/ 01 февраля 2012

Избегайте использования Encoding.Default (можете ли вы сказать, что это такое?) И используйте тот, который, как вы знаете, использует другая (Python) часть, например Encoding.UTF8

В противном случае мыможет потребоваться увидеть ваш код для Base32.ToBase32String, чтобы увидеть, отличаются ли входные или выходные данные.

...