Задать вопрос

Как подписать строку сертификатом GOST 2012?

Здравствуйте, у меня есть сертификат GOST 2012, выданный с помощью программы CryptoPRO.
Мне необходимо написать программу на C# которая будет подписывать строку этим сертификатом.
Вот что я установил на компьютер:
  • КриптоПро CSP 5.0 для Windows
  • КриптоПро .NET 1.0.7132.0 (NET-x64-rus.msi)
  • КриптоПро .NET SDK 1.0.7132.0 (NETSDK-x64-rus.msi)

Далее посмотрел пример по адресу:
C:\Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\CMS\cs\DetachedSignature.cs

Вроде все просто, написал код по примеру:
sing System;
using System.IO;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace MyCrypto
{
    class SingleSigner
    {
        public void MsgSegner(string msg)
        {
            Console.WriteLine("Полученное сообщение: " + msg);

            Encoding unicode = Encoding.Unicode;
            byte[] msgBytes = unicode.GetBytes(msg);

            X509Certificate2 signerCert = GetSignerCert("ГБУЗ");

            Console.WriteLine(signerCert.Subject);
            try
            {
                byte[] encodedSignature = SingMsg(msgBytes, signerCert);
                File.WriteAllBytes("signature.bin", encodedSignature);
            }
            catch (System.ArgumentNullException ex)
            {

            }
            

        }

        private static byte[] SingMsg(Byte[] msg, X509Certificate2 singleCert)
        {

            ContentInfo contentInfo = new ContentInfo(msg);
            SignedCms signedCms = new SignedCms(contentInfo, true);
            CmsSigner cmsSigner = new CmsSigner(singleCert);

            signedCms.ComputeSignature(cmsSigner); //В этой строке выходит исключение: 
//System.Security.Cryptography.CryptographicException: "Could not determine signature algorithm for the signer certificate."
            return signedCms.Encode();
            
           
        }

        static X509Certificate2 GetSignerCert(string signerName)
        {
            X509Store storeMy = new X509Store(StoreName.My,
                StoreLocation.LocalMachine);
            storeMy.Open(OpenFlags.ReadOnly);

            Console.WriteLine("Число сертификатов: " + storeMy.Certificates.Count);

            X509Certificate2Collection certColl =
                storeMy.Certificates.Find(X509FindType.FindBySubjectName,
                signerName, false);
            Console.WriteLine(
                "Найдено {0} сертификат(ов) в хранилище {1} для субъекта {2}",
                certColl.Count, storeMy.Name, signerName);

            if (certColl.Count == 0)
            {
                Console.WriteLine(
                    "Сертификат для данного примера не найден " +
                    "в хранилище. Выберите другой сертификат для подписи. ");
                return null;
            }

            storeMy.Close();

            return certColl[0];
        }
    }
}

Я так понял что ошибка в том что он не знает как работать с GOST сертификатами, но что я делаю не так? Заранее большое спасибо!
  • Вопрос задан
  • 1734 просмотра
Подписаться 3 Простой 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы