Как поменять алгоритм шифрование в AsymmetricAlgorithm

422
30 декабря 2016, 09:48

Задача уйти от ошибки в проверки подписи объекта SignedXml. Проблема в том, что после последних обновлений windows, они отключили поддержку алгоритма

http://www.w3.org/2000/09/xmldsig#rsa-sha1

Но проблема в том, что он является дефолтным для X509Certificate2.PrivateKey

И этот

   public AsymmetricAlgorithm PrivateKey { get; set; }
    //
    // Сводка:
    //     Получает объект System.Security.Cryptography.X509Certificates.X509Certificate2.PublicKey,
    //     связанный с сертификатом.
    //
    // Возвращает:
    //     Объект System.Security.Cryptography.X509Certificates.X509Certificate2.PublicKey.
    //
    // Исключения:
    //   System.Security.Cryptography.CryptographicException:
    //     Значение ключа не является значением RSA или DSA, или ключ не читается.

По дефолту имеет именно алгоритм rsa-sha1. И я не знаю как его подменить(Наследовать все классы из задачи включая SignedXml-кажется плохим решением)? Буду рад любой информации по вопросу! На сайте msdn мне ответили, что нужно изначально иметь сертификаты с другим алгоритмом Вопрос на MSDN. А вот на форуме КриптоПро, что алгоритм можно использовать другой.Вопрос на форуме КриптоПро.

Answer 1

Судя по документации MSDN, можно. Для этого надо:

  1. Создать новый класс и отнаследовать его от X509AsymmetricSecurityKey.
  2. Переопределить свойство KeySize. Это свойство возвращает размер ключа сертификата (пары публичный/приватный ключ)
  3. Переопределить метод DecryptKey. Этот метод вызывается WCF, чтобы расшифровать симметричный ключ с помощью приватного ключа сертификата.
  4. Переопределить метод GetAsymmetricAlgorithm. Этот метод вызывается WCF и возвращает экземпляр класса AsymmetricAlgorithm, представляющего собой криптопровайдер для приватного или публичного ключа сертификата, в зависимости от переданного параметра.
  5. Опционально: переопределить метод GetHashAlgorithmForSignature. Переопределите этот метод, если вам нужно использовать другую реализацию HashAlgorithm.
  6. Переопределите метод GetSignatureFormatter. Этот метод возвращает экземпляр класса AsymmetricSignatureFormatter, связанный с приватным ключом экземпляра.
  7. Переопределите метод IsSupportedAlgorithm. Этот метод используется для проверки поддержки криптографического алгоритма данной реализацией ключа.

Также потребуется:

  1. Создать наследника X509SecurityToken, использующего кастомный ключ.
  2. Создать наследника SecurityTokenProvider, возвращающего кастомный токен из п.1.
  3. Создать наследника ClientCredentialsSecurityTokenManager, если ключ нужен на стороне клиента.
  4. Создать наследника ServiceCredentialsSecurityTokenManager, если ключ нужен на стороне сервера.

Подробнее в статье Изменение поставщика служб шифрования для закрытого ключа сертификата X.509 на MSDN.

READ ALSO
Теряется фокус кнопки

Теряется фокус кнопки

При наведении на кнопку теряется фокус при положении курсора в пустом месте между границей кнопки и надписью кнопки

352
Змейка c# , изменение направления

Змейка c# , изменение направления

Тут реализована смена направления у змейки

608
Кодирование текста из textBox с помощью pictureBox на С#

Кодирование текста из textBox с помощью pictureBox на С#

Всем приветНадеюсь, что здесь я найду ответ на интересующий меня вопрос

530
Знаки сравнения из string

Знаки сравнения из string

Всем приветИнтересна такая вещь,можно ли получить знаки сравнения (> < = >= <=) из string и потом использовать их?

508