Подтвердить что ты не робот

Как проверить подпись, загрузка PUBLIC KEY из файла CRT?

Я рассмотрел многие форумы и примеры, но никто не помог мне. Мне нужно проверить подпись из любого веб-сервиса. У меня есть файл test.crt с открытым ключом для проверки.

static bool Verify(string text, string signature)
{
  X509Certificate2 cert = new X509Certificate2(
      HttpContext.Current.Server.MapPath("test-server.cert"));
  RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key;

  // Hash the data
  SHA1Managed sha1 = new SHA1Managed();
  UnicodeEncoding encoding = new UnicodeEncoding();
  byte[] data = encoding.GetBytes(text);
  byte[] sign = Convert.FromBase64String(signature);
  byte[] hash = sha1.ComputeHash(data);

  return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign);
}

Но результат всегда неверен: (

У меня есть пример OpenSSL:

openssl base64 -d -in signature -out signature.bin
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway
4b9b3361

Ответ 1

Я подозреваю, что использование UnicodeEncoding может стать причиной сбоев. Как показано ниже, байты ASCIIEncoding и UnicodeEncoding не совпадают по той причине, что ASCII представляет собой 8-битную кодировку, а в кодировке Unicode Windows - 16 бит. В другом вопросе Невозможно получить подпись вы использовали ASCIIEncoding. Таким образом, предполагается, что подпись вычисляется по байтам ASCIIEncoding для текста/строки и проверка с использованием UnicodeEncoding, очевидно, не будет соответствовать.

string text = "Hello";
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length);
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length);

Выходы

ASCIIEncoding bytes length: 5
UnicodeEncoding bytes length: 10