Страницы

Поиск по вопросам

среда, 22 января 2020 г.

КриптоПро.NET SDK работа с ЭЦП

#c_sharp #net #криптография


Как подписать и зашифровать файл используя библиотеку КриптоПро.NET SDK имея USB токен?
Алг. подписи ГОСТ 34.10-2001(512 bits)
Алг. хэша    ГОСТ 34-11-94

Я имею файл в формате p7s.p7m. Его содержимое разделено тегами 

----- BEGIN PKCS7 ENCRYPTED ----- --- END PKCS7 ENCRYPTED ----- 

    


Ответы

Ответ 1



Пример подписи для Алгоритма ГОСТ 34-10. Источник namespace Samples.MySamples class Gost3410CSPSample { [STAThread] static void Main(string[] args) { try { //Создаем новый Гост-34.10 CSP. Gost3410CryptoServiceProvider Gost = new Gost3410CryptoServiceProvider(); //32-х битное значение хэш для подписи. byte[] HashValue = { 59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134,130, 135, 0, 0, 0, 0, 0,0,0,0,0,0,0,0}; //Подписываем значение хэш. byte[] SignedHashValue = GostSignHash(HashValue, Gost, "Gost3411"); //Проверяем правильность подписи и выводим результат. bool b = GostVerifyHash(HashValue, SignedHashValue, Gost, "Gost3411"); if (b) { Console.WriteLine("Подпись вычислена верно."); } else { Console.WriteLine("Подпись вычислена неверно."); } } catch (ArgumentNullException e) { Console.WriteLine(e.Message); } } static byte[] GostSignHash(byte[] HashToSign, Gost3410CryptoServiceProvider key, string HashAlg) { try { //Создаем форматтер подписи с закрытым ключом из переданного //функции криптопровайдера. GostSignatureFormatter Formatter = new GostSignatureFormatter((Gost3410CryptoServiceProvider)key); //Устанавливаем хэш-алгоритм. Formatter.SetHashAlgorithm(HashAlg); //Создаем подпись для HashValue и возвращаем ее. return Formatter.CreateSignature(HashToSign); } catch (CryptographicException e) { Console.WriteLine(e.Message); return null; } } static bool GostVerifyHash(byte[] HashValue, byte[] SignedHashValue, AsymmetricAlgorithm key, string HashAlg) { try { //Создаем форматтер подписи с закрытым ключом из переданного //функции криптопровайдера. GostSignatureDeformatter Deformatter = new GostSignatureDeformatter(key); //Устанавливаем хэш-алгоритм. Deformatter.SetHashAlgorithm(HashAlg); //Проверяем подпись и возвращаем результат. return Deformatter.VerifySignature(HashValue, SignedHashValue); } catch (CryptographicException e) { Console.WriteLine(e.Message); return false; } } } Задать контейнер можно таким способом: CspParameters cspParameters = new CspParameters(75); cspParameters.KeyContainerName = "MCPUEpOv";

Ответ 2



Я решил идти по пути наименьшего сопротивления и использовать консольную утилиту Cyptcp компании КриптоПро. Для работы утилиты нужен криптопровайдер КриптоПро CSP. КриптоПро CSP на одну машине стоит около 2 000 руб, а Cyptcp около 700 руб. Cyptcp и АРМ КриптоПро совместимы между собой. Формирую команды: /// /// Формирование команд для утилиты Cyptcp /// public static class Command { /// /// Команда на запуск дешифрования /// /// Имя сертификата /// Путь к защифрованному файлу /// Путь к дешифрованному файлу /// public static string Decript(string nameCertificate, string pathEncryptedFile, string pathSave) { return "-decr -dn \"" + nameCertificate + "\" " +"\""+ pathEncryptedFile + "\" \"" + pathSave+"\""; } /// /// Проверка подписи. Сертификат выбирается из хранилища сертификатов /// /// Путь к подписанному файлу /// Путь к очищенному от подписи файлу /// public static string VerificationSignature(string pathSignFile, string pathFile) { return "-verify -verall " + "\"" + pathSignFile + "\" \"" + pathFile + "\""; } public static string Sign(string nameCertificate, string pathFile, string pathSignedFile) { return "-sign -dn \"" + nameCertificate + "\" " + "\"" + pathFile + "\" \"" + pathSignedFile + "\""; } public static string Encrypt(string nameRecipientCertificate, string pathSigFile, string pathSave) { return "-encr -dn \"" + nameRecipientCertificate + "\" " + "\"" + pathSigFile + "\" \"" + pathSave + "\""; } } Запуск утилиты на выполнение команды: private void RunCommand(string command, string pathApplication) { using (Process process = new Process()) { //Имя файла. process.StartInfo.FileName = pathApplication; //Директория. process.StartInfo.WorkingDirectory = Path.GetDirectoryName(pathApplication); //Команда. process.StartInfo.Arguments = command; //Не показывать окно приложения. process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; process.StartInfo.StandardOutputEncoding = Encoding.Default; process.Start(); //Ответ на диалог выбора сертификата process.StandardInput.WriteLine("y"); } }

Комментариев нет:

Отправить комментарий