AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
128 stars 41 forks source link

Недопустимый тип криптографического сообщения. #9

Open frantic0589 opened 5 years ago

frantic0589 commented 5 years ago

Добрый день. Для работы требуется установленное КриптоПРО CSP на ПК, или вся информация об OID и ключах шифрования тут имеется? Пытаюсь декодировать зашифрованный файл с подписью: GostSignedCms gostSignedCms = new GostSignedCms(); gostSignedCms.Decode(fileName);

Получаю ошибку: "System.Security.Cryptography.CryptographicException: Недопустимый тип криптографического сообщения."

С установленным криптопро csp и стандартным классом .net EnvelopedCms все удается сделать. Но имеется необходимость сделать реализацию без установленного криптопро, чтобы можно было опубликовать приложение в вэб, без установленного криптопро, в котором имеется вся информация по алгоритмам шифрования: https://cpdn.cryptopro.ru/content/csp40/html/group___pro_c_s_p_ex_DP8.html

AlexMAS commented 5 years ago

Здравствуйте. Библиотека представляет собой обёртку над криптопровайдером - CryptoPro или VipNet. Т.е. реализует часть абстракций из System.Security.Cryptography на базе этих криптопровайдеров. Соответственно, в большинстве случаев нужно наличие установленного CryptoPro или VipNet. Можете привести пример кода, который возвращает исключение?

frantic0589 commented 5 years ago

Сам метод Decode(fileName) возвращает ошибку.

AlexMAS commented 5 years ago

В случае, если криптопровайдер не установлен?

frantic0589 commented 5 years ago

Нет, даже когда установлен.

AlexMAS commented 5 years ago

Я постараюсь воспроизвести ошибку. Пока могу предложить посмотреть примеры, может что-то удастся найти https://github.com/AlexMAS/GostCryptography/tree/master/Source/GostCryptography.Tests/Pkcs

AlexMAS commented 5 years ago

Проверил на своей машине, все должно работать. Сертификат установлен нормально? Может проблема с поиском самого сертификата.

Сам метод Decode(fileName) возвращает ошибку.

Не могу найти такую перегрузку.

frantic0589 commented 5 years ago

Сертификат в данном случае не нужен. Метод декодирует зашифрованное сообщение.

AlexMAS commented 5 years ago

Видимо, мы говорим про разные вещи. Можете всё-таки привести пример кода.

frantic0589 commented 5 years ago

Ну в принципе я уже выше писал: GostSignedCms gostSignedCms = new GostSignedCms(); gostSignedCms.Decode(fileName); В fileName массив байтов файла bin или p7s

AlexMAS commented 5 years ago

Я попробовал возможные варианты, но не могу получить подобного исключения. На основе этого есть предположение, что проблема с данными. Вы уверены, что с ними все нормально? Как вы получаете быйты для декодирования? Согласно примеру, который вы привели, содержимое сообщения должно быть включено (detached=false).

В этой версии также есть одна особенность, нужно явно установить тип криптопровайдера. В вашем случае это не должно играть роли, тем не менее:

// ViPNet CSP (by default)
GostCryptoConfig.ProviderType = ProviderTypes.VipNet;

// CryptoPro CSP
GostCryptoConfig.ProviderType = ProviderTypes.CryptoPro;
AlexMAS commented 5 years ago

Для информации.

Выпустил v2.0.0, которая включает поддержку алгоритмов 2012 года, а также исправление известных ошибок совместимости с ViPNet CSP 4.2. Версия была протестирована на конфигурациях:

В случае с CryptoPro CSP важно установить версию не ниже 4.0.9963 (на момент тестирования последний private-релиз), поскольку она содержит исправление критической ошибки при работе с сертификатами ГОСТ Р 34.10-2012/1024.

Также нужно отметить, что ViPNet CSP до последней на данный момент версии 4.2.8.51670 (включительно) не поддерживает создание производных симметричных ключей на основе хэш-функций ГОСТ Р 34.11-2012. Ничего критичного в этом нет, это оказывает влияние только на возможность генереции случайных симметричных ключей с использованием методов Gost_R3411_2012_256_PRF.DeriveKey() и Gost_R3411_2012_512_PRF.DeriveKey().

Наконец, в ходе добавления поддержки алгоритмов 2012 года были произведены крупные изменения, включающие перенос/переименование существующих классов. Для перехода с v1.0 на v2.0 нужно воспользоваться следующей иструкцией.

AlexMAS commented 5 years ago

@frantic0589 Здравствуйте. Получилось решить проблему?

frantic0589 commented 5 years ago

@AlexMAS Добрый день. К сожалению пока нет.

Bykiev commented 5 years ago

@frantic0589, а вы пробовали проверять подпись с помощью утилиты cryptcp от Крипто-Про? Скорее всего, что-то не так с подписью в файле.

avragov commented 5 years ago

А причем здесь вообще КриптоПро или любой другой криптопровайдер? Сообщение в формате Pkcs7 декодируется из структуры ASN.1. Вы же не подпись у сообщения проверяете и не расшифровываете его. Вангую, что формат сообщения не соответствует указываемому формату при декодировании. Лучше воспользоваться Certenroll API.

AlexMAS commented 4 years ago

@frantic0589 Получилось решить проблему? :)

frantic0589 commented 4 years ago

К сожалению нет. Вы спрашивали при чем здесь криптопровайдер, сообщение закодировано по РФ ГОСТу. Windows без криптопро не знает про наш ГОСТ. И только после установки криптопровайдер в реест записывается значения типа хэш и ключ, после чего он может по нашему ГОСТу шифровать и читать эти сообщения.

AlexMAS commented 4 years ago

@frantic0589 Правильно ли я понимаю, что указанная вами ошибка возникает только когда не установлен криптопровайдер?

avragov commented 4 years ago

Идет подмена понятий. Сообщение м.б.зашифровано по ГОСТу, а не закодировано. По ГОСТу также может быть вычислена эцп или хэш. ASN.1 это формат кодирования сообщения