Example #1
0
 public byte[] Sign(byte[] data, int certIndex)
 {
     try
     {
         if (hash == null)
         {
             throw new NullReferenceException("Compute hash first");
         }
         CspParameters cp                     = new CspParameters();
         var           privateKey             = ClientCertificates[certIndex].PrivateKey as Gost3410_2012_256CryptoServiceProvider;
         var           uniqueKeyContainerName = privateKey.CspKeyContainerInfo.UniqueKeyContainerName;
         cp.KeyContainerName = uniqueKeyContainerName;
         cp.ProviderType     = 75;
         cp.ProviderName     = null;
         Gost3410_2012_256 gkey = new Gost3410_2012_256CryptoServiceProvider(cp);
         Gost3410_2012_256CryptoServiceProvider srcContainer = new Gost3410_2012_256CryptoServiceProvider(cp);
         Gost3410Parameters srcPublicKeyParameters           = srcContainer.ExportParameters(false);
         if (srcContainer == null)
         {
             throw new Exception("У сертификата нет приватного ключа");
         }
         signature = srcContainer.CreateSignature(hasher.Hash);
         sCert     = ClientCertificates[certIndex].Export(X509ContentType.Cert);
         sTime     = DateTime.Now;
         return(Asn1Formatter.CreateSignature(signature, sCert, sTime, data));
     }
     catch (CryptographicException ex)
     {
         Console.WriteLine(ex.Message);
         return(null);
     }
 }
Example #2
0
        // Шифрование тестового файла.
        static void EncryptTestFile(
            Gost3410_2012_256 publicKey,
            Gost3410_2012_256CryptoServiceProvider privateKey,
            string fileId = "2012_256")
        {
            // Создаем симметричный ключ.
            Gost28147 symmetric = Gost28147.Create();

            // Открываем ключ отправителя.
            Gost3410Parameters srcPublicKeyParameters = privateKey.ExportParameters(false);

            // Создаем agree ключ
            GostSharedSecretAlgorithm agree = privateKey.CreateAgree(
                publicKey.ExportParameters(false));

            // Зашифровываем симметричный ключ на agree ключе.
            byte[] WrappedKey = agree.Wrap(symmetric,
                                           GostKeyWrapMethod.CryptoPro12KeyWrap);

            // Создаем поток шифратора.
            ICryptoTransform transform = symmetric.CreateEncryptor();

            // Создаем зашифрованный файл.
            using (FileStream ofs = new FileStream(string.Format(EncryptedFileName, fileId), FileMode.Create))
            {
                BinaryWriter bw = new BinaryWriter(ofs);

                // Записываем зашифрованный симметричный ключ.
                bw.Write(WrappedKey.Length);
                bw.Write(WrappedKey);

                // Записываем синхропосылку
                bw.Write(symmetric.IV.Length);
                bw.Write(symmetric.IV);

                // Передаем открытый ключ.
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(ofs, srcPublicKeyParameters);

                // Создаем поток шифрования для записи в файл.
                using (CryptoStream cs = new CryptoStream(ofs, transform, CryptoStreamMode.Write))
                {
                    byte[] data = new byte[4096];
                    // Открываем входной файл.
                    using (FileStream ifs = new FileStream(string.Format(SourceFileName, fileId), FileMode.Open, FileAccess.Read))
                    {
                        // и переписываем содержимое в выходной поток.
                        int length = ifs.Read(data, 0, data.Length);
                        while (length > 0)
                        {
                            cs.Write(data, 0, length);
                            length = ifs.Read(data, 0, data.Length);
                        }
                    }
                }
            }
        }
Example #3
0
        /// <summary>
        /// Создает маркант с помошью ключа согласования
        /// </summary>
        /// <param name="gost28147">Сессионный ключ</param>
        /// <param name="certFileName">Путь к файлу сертификата получателя</param>
        /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом отправителя</param>
        /// <returns>Сгенерированный маркант</returns>
        public static Markant CreateMarkantWithKeyAgree(Gost28147 gost28147, string certFileName, ProviderInitData providerInitData)
        {
            // Разбираем сертификат получателя
            X509Certificate2 cert = new X509Certificate2(certFileName);

            if (!(cert.PublicKey.Key is Gost3410_2012_256 gost3410))
            {
                throw new CryptographicException("Not a GOST certificate");
            }

            //Готовим параметры контейнера
            CspParameters cspParameters = new CspParameters
            {
                ProviderType     = (int)providerInitData.ProviderType,
                Flags            = CspProviderFlags.NoPrompt,
                KeyPassword      = providerInitData.ProviderPassword,
                KeyContainerName = providerInitData.ProviderContainerName
            };
            //Открываем контейнер
            Gost3410_2012_256CryptoServiceProvider encrypt_gost3410 = new Gost3410_2012_256CryptoServiceProvider(cspParameters);
            Gost3410Parameters encrypt_gost3410PublicKeyParameters  = encrypt_gost3410.ExportParameters(false);
            // Создаем agree ключ
            GostSharedSecretAlgorithm agree = encrypt_gost3410.CreateAgree(gost3410.ExportParameters(false));

            // Зашифровываем симметричный ключ на agree ключе.
            byte[] wrappedKey = agree.Wrap(gost28147, GostKeyWrapMethod.CryptoProKeyWrap);

            //Формируем маркант
            Markant m = new Markant
            {
                Version    = 2,
                SessionKey = wrappedKey,
                IV         = gost28147.IV,
                PublicKey  = Helper.ObjectToByteArray(encrypt_gost3410PublicKeyParameters)
            };

            return(m);
        }