Как проверить подпись DSA в C #?
Дано:
- текст сообщения,
- подписанный дайджест (обычно формат ASN.1 DER),
- открытый ключ (в подписанном сертификате X.509, в формате PEM или DER)
Я перепробовал несколько подходов, но безуспешно:
OpenSSL.NET : различные странные ошибки с библиотекой; У меня есть открытый поток, работающий с автором над SourceForge , но мне пока не удалось решить эту проблему.
Microsoft .NET API: не может распаковать подпись DER для сравнения. Сигнатура DSA составляет 40 байтов (два 20-байтовых целых числа), но представлена в виде последовательности двух целых чисел в кодировке DER, поэтому общая длина может варьироваться от 46 до 48 байтов (см. этот пост для краткий обзор.) Хотя .NET включает код для анализа ASN.1 / DER (потому что он может читать сертификаты в формате DER), он глубоко скрыт, и нет способа получить к нему доступ, чтобы вы могли правильно извлечь 40 байтов из ASN .1 / кодированный DER сигнал Эта проблема привела меня к следующему варианту ...
BouncyCastle: с помощью функций Org.BouncyCastle.Asn1
я могу проанализировать сигнатуру ASN.1 и извлечь ее в целочисленные значения компонентов R и S. Но когда я передаю их процедурам проверки подписи, это не дает никакого объяснения. Я не уверен, что делаю что-то не так, потому что API C # полностью недокументирован , а версия Java едва документирована (но я не могу найти пример или информацию HOWTO).
Я занимаюсь этой проблемой уже около недели. Я знаю, что кто-то должен был сделать это раньше, но я не нашел полных / рабочих примеров.
У меня здесь три проекта на C #, каждый на 95% завершен, но с одним критическим недостатком, который приводит к сбою. Любой работающий пример кода будет очень полезен.
edit: вот пример подписи, которую я пытаюсь проверить, преобразованной в Base64 и ASCII-гекс, чтобы сделать его пригодным для продажи. Этот конкретный является 47 байтами, но надлежащий синтаксический анализатор должен все еще принять это, прочитайте на спецификации DER для получения дополнительной информации (BER / DER добавляет ведущий 00, чтобы подтвердить знак, если MSB равен 1)
Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=
ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933
Структура соответствует спецификации DER; он разбирается следующим образом:
30 2d: sequence, length 45 (may vary from 44 to 46)
02 15: integer, length 21 (first byte is 00 to confirm sign)
009482ad831075b3a773b89ce768dfc983bbc992b7
02 14: integer, length 20 (leading 00 not necessary for this one)
69d6666e29fb06f5f1a5ea0987b761aae0f60933
Написание собственного парсера DER на самом деле не вариант, слишком много места для ошибок, и должен быть способ сделать это правильно.