Для логического завершения темы немного расскажу, как решил проблему в итоге.
Поменять сертификат VipNet на сертификат CryptoPro так и не получилось, поскольку для нас, как для исполнителей, это данность, с которой нужно как-то уживаться. В итоге пришлось долго и упорно разбираться с проблемой. (Причем одному, потому что все ветки на форуме Infotecs больше напоминают монолог: сам задал вопрос и, в лучшем случае, сам же на него ответил. В связи с этим команде КриптоПро отдельная благодарность!) Мои изыскания привели меня к тому, что я стал изучать исходный код КриптоПро .NET (через .NET Reflector, да простят меня разработчики). В итоге я попытался сделать все то же самое, что делает КриптоПро .NET, заменив лишь идентификатор криптопровайдера: с 75 (CryptoPro CSP) на 2 (VipNet CSP). После этого, я выполнил свой тест (который отлично работает с сертификатор CryptoPro и КриптоПро .NET). И он, конечно, не заработал. :) Однако не заработал по вполне конкретным причинам, которые удалось установить.
Первая ошибка, которая у меня произошла, была при обращении к VipNet CSP, при попытке установки KP_PADDING. Я, конечно,
попытался выяснить, почему это происходит, но Infotecs мне так и не дал ответа. В итоге, я перебрал все возможные значения KP_PADDING и пришел к выводу, что VipNet CSP не поддерживает его программную установку. Это, конечно, мои субъективные выводы, касающиеся исключительно VipNet CSP 3.2 и 4.x и только моего операционного окружения. В итоге я просто закомментировал установку KP_PADDING. (В КриптоПро .NET установка KP_PADDING делается в приватном конструкторе класса CPCryptoAPITransform.) Исправление этой проблемы привело меня к следующей и, как выяснилось, последней.
Вторая ошибка произошла на этапе дешифрации, а именно, при дешифрации последнего блока зашифрованного сообщения. При вызове функции CryptDecrypt() с параметром Final=true она вернула false, соответственно было вызвано исключение. (В КриптоПро .NET вызов CryptDecrypt() осуществляется в методе COMCryptography.EndCrypt()). В итоге я проигнорировал результат последнего вызова функции CryptDecrypt() и проанализировал результат дешифрации. И пришел к выводу, что сообщение было полностью дешифровано и никакой ошибки на самом деле не произошло.
Таким образом, я пришел к собственным субъективным выводам. Во-первых, VipNet CSP не поддерживает установку KP_PADDING. Во-вторых, при вызове функции CryptDecrypt() с параметром Final=true при корректных данных она возвращает некорректный результат. Первую проблему я решил, проигнорировав результат установки KP_PADDING, вторую - проигнорировав результат дешифрации последнего блока сообщения. Решение, конечно, не из лучших, но в силу имеющейся данности (VipNet), с которой я вынужден уживаться, оно мне подошло.
Возможно, мои изыскания кому-нибудь помогут. :)
Отредактировано пользователем 19 декабря 2014 г. 12:35:43(UTC)
| Причина: Не указана