HMACSHA256 проблема с русскими символами C#

253
21 ноября 2017, 20:46

Добрый вечер, мне нужно подписать данные (строку) ключом, функцией HMACSHA256 Пользователь сам вводит строку

Когда я подписываю обычные символы, всё ок - в ответе правильный хеш, если же строка содержит русские символы, то хеш неправильный Вот код на C#:

using System;
using System.IO;
using System.Security.Cryptography;     
using System.Text;
public class Program
{
     public static void Main()
  {
    Encoding enc = Encoding.GetEncoding("ASCII");
    String key = "20f31fbce8c54800bffa5f5d767f2cf142ebcfb87ac4ab76c0c55ba7f1934481";
    String packet;
    Console.WriteLine("Input Data: ");
    packet = Console.ReadLine();
    HMACSHA256 hm = new HMACSHA256(enc.GetBytes(key));
    byte[] result = hm.ComputeHash(enc.GetBytes(packet));
    String hex = BitConverter.ToString(result);
    hex = hex.Replace("-", "");
    Console.WriteLine(hex.ToLower());
  }
}

Есть код на Python 2.7 который правильно подписывает строку с русскими символами

import hmac,hashlib
key = '20f31fbce8c54800bffa5f5d767f2cf142ebcfb87ac4ab76c0c55ba7f1934481'
packet= raw_input("Input Data:")
sig = hmac.new(key, packet, digestmod=hashlib.sha256).digest().encode("hex")
print(sig)

Пример, вводим слово: форум

Правильный хеш от python: a6aa8f3d443d7e2592eea7b5c290dbe7d418c8329912b22c2e4e4c0d1ce6a18b

Неправильный от c#: e5a15bb8434e7f0fb6b6ce5e63730a7d119dc14d223ffb5f48a132416948ecdf Менял различные кодировки, не работает

Нужна помощь, заранее спасибо!

Answer 1

Я не знаю, какие вы кодировки пробовали, но работает с UTF-8:

String key = "20f31fbce8c54800bffa5f5d767f2cf142ebcfb87ac4ab76c0c55ba7f1934481";
HMACSHA256 hm = new HMACSHA256(Encoding.ASCII.GetBytes(key));
byte[] result = hm.ComputeHash(Encoding.UTF8.GetBytes("форум"));
String hex = BitConverter.ToString(result);
Console.WriteLine(hex.Replace("-", ""));

Результат:

A6AA8F3D443D7E2592EEA7B5C290DBE7D418C8329912B22C2E4E4C0D1CE6A18B
READ ALSO
Архитектура c RabbitMQ и SingalR .net

Архитектура c RabbitMQ и SingalR .net

Здравствуйте, мой вопрос касательно архитектуры, точнее его смыслаЯ залез в эту тему, до конца не понимая в чем смысл RabbitMQ и SignalR

231
Как сделать split по строкам?

Как сделать split по строкам?

Правильной ли является часть кода?

255
Дата из c# в Angular

Дата из c# в Angular

Получаю данные из Web API в формате jsonДаты имеют такой вид:

203
C# Как проверить тип прокси, без webrequest

C# Как проверить тип прокси, без webrequest

Интересует каким образом можно средствами C# определить тип прокси: Socks4, Socks5, http, имея адрес : порт не используя webrequest запросовЕсли не затруднит...

202