Ответ
КриптоПро CSP — это криптографический провайдер, широко используемый в .NET-экосистеме, особенно для задач, требующих соблюдения ГОСТ (государственных стандартов), таких как электронный документооборот и работа с квалифицированной электронной подписью (КЭП).
Типичные сценарии использования:
- Создание и проверка электронной подписи по ГОСТ Р 34.10.
- Шифрование/расшифрование данных по ГОСТ 28147-89.
- Работа с сертификатами из закрытых ключевых контейнеров.
- Формирование и проверка запросов на сертификаты (CSR).
Базовый пример подписи данных в C#:
using System.Text;
using CryptoPro.Sharpei; // Основная библиотека
public byte[] SignData(byte[] dataToSign, string certificateThumbprint)
{
// 1. Найти сертификат в хранилище
var store = new GostCertificates(StoreName.My, StoreLocation.CurrentUser);
var cert = store.FindByThumbprint(certificateThumbprint);
if (cert == null)
throw new ArgumentException("Сертификат не найден.");
// 2. Создать объект для подписи
var signedCms = new GostSignedCms(new ContentInfo(dataToSign), detached: false);
var signer = new CmsSigner(cert) { IncludeOption = X509IncludeOption.EndCertOnly };
// 3. Вычислить подпись
signedCms.ComputeSignature(signer);
return signedCms.Encode(); // Возвращает данные с присоединённой подписью
}
Ключевые зависимости и настройки:
- Библиотеки:
CryptoPro.Sharpei(основная), иногдаSystem.Security.Cryptographyс использованием классов-обёрток. - Предварительные условия: На машине должен быть установлен дистрибутив КриптоПро CSP и корректно настроены контейнеры закрытых ключей.
- Алгоритмы: ГОСТ Р 34.10-2001/2012 (подпись), ГОСТ 28147-89 (шифрование), ГОСТ Р 34.11-94/2012 (хэш).
Распространённые проблемы и решения:
- "Ключ не найден": Проверьте, что контейнер ключа доступен текущему пользователю и КриптоПро CSP видит его. Используйте утилиту
cpconfig. - Версионная несовместимость: Убедитесь, что версия библиотеки
CryptoPro.Sharpeiсовместима с установленной версией CSP. - Ошибки при работе в IIS или сервисах: Учётная запись пула приложений (например,
ApplicationPoolIdentity) должна иметь права на доступ к контейнеру ключа. Часто требуется импортировать сертификат с ключом в хранилище для конкретного пользователя или в локальную машину с соответствующими правами. - Логирование: Включите детальное логирование через
CryptoPro.Sharpei.Logдля диагностики внутренних ошибок провайдера.