// Действия получателя - расшифровываем полученные сессионный ключ и сообщение.
        byte[] GostDecrypt(GostKeyTransport encKey, byte[] encBytes, byte[] IV, AsymmetricAlgorithm AssymKey)
        {
            // Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
            GostKeyExchangeDeformatter Deformatter = new GostKeyExchangeDeformatter(AssymKey);
            // Получаем ГОСТ-овый ключ из GostKeyTransport.
            Gost28147 key = (Gost28147)Deformatter.DecryptKeyExchange(encKey);

            // Устанавливаем синхропосылку.
            key.IV = IV;
            byte[] targetBytes     = new byte[1024];
            int    currentPosition = 0;

            // Создаем дешифратор для ГОСТ.
            ICryptoTransform cryptoTransform =
                key.CreateDecryptor();

            int inputBlockSize   = cryptoTransform.InputBlockSize;
            int sourceByteLength = encBytes.Length;

            try
            {
                int numBytesRead = 0;
                while (sourceByteLength - currentPosition >= inputBlockSize)
                {
                    // Преобразуем байты начиная с currentPosition в массиве
                    // sourceBytes, записывая результат в массив targetBytes.
                    numBytesRead = cryptoTransform.TransformBlock(
                        encBytes,
                        currentPosition,
                        inputBlockSize,
                        targetBytes,
                        currentPosition);

                    currentPosition += numBytesRead;
                }

                // Преобразуем последний блок.
                byte[] finalBytes = cryptoTransform.TransformFinalBlock(
                    encBytes,
                    currentPosition,
                    sourceByteLength - currentPosition);

                // Записываем последний расшифрованный блок
                // в массив targetBytes.
                finalBytes.CopyTo(targetBytes, currentPosition);

                currentPosition += finalBytes.Length;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Caught unexpected exception:" + ex.ToString());
            }
            // Убираем неиспользуемые байты из массива.
            return(TrimArray(targetBytes, currentPosition));
        }
        public static SymmetricAlgorithm DecryptKeyClass(byte[] keyData, Gost3410AsymmetricAlgorithmBase privateKey)
        {
            if (keyData == null)
            {
                throw ExceptionUtility.ArgumentNull("keyData");
            }

            if (privateKey == null)
            {
                throw ExceptionUtility.ArgumentNull("privateKey");
            }

            var deformatter   = new GostKeyExchangeDeformatter(privateKey);
            var decryptionKey = deformatter.DecryptKeyExchangeAlgorithm(keyData);

            return(decryptionKey);
        }
        /// <summary>
        /// Расшифровать симметричный ключ
        /// </summary>
        /// <param name="symmKey"></param>
        /// <param name="recipientContainer"></param>
        /// <param name="isMachine"></param>
        /// <returns></returns>
        public SymmetricAlgorithm DecryptSymmKey(byte[] symmKey, string recipientContainer, bool isMachine)
        {
            Log.DssLogger.Debug($"Расшифрование симметричного ключа по ключу в контейнере {recipientContainer}");

            SymmetricAlgorithm symmetric;

            try
            {
                // Открываем ключ получателя.
                CspParameters par = new CspParameters(75, null, recipientContainer);
                if (isMachine)
                {
                    par.Flags = CspProviderFlags.UseMachineKeyStore;
                }

                Gost3410CryptoServiceProvider destContainer2 = new Gost3410CryptoServiceProvider(par);

                // Создаем deformater для транспортного ключа.
                GostKeyExchangeDeformatter keyDeformater2 = new GostKeyExchangeDeformatter(destContainer2);

                // Открываем зашифрованный файл.
                using (MemoryStream ms = new MemoryStream(symmKey))
                {
                    // Читаем зашифрованный симметричный ключ.
                    BinaryReader br = new BinaryReader(ms);
                    int          transportLength = br.ReadInt32();
                    byte[]       transport       = br.ReadBytes(transportLength);

                    symmetric = keyDeformater2.DecryptKeyExchangeData(transport);

                    // Читаем синхропосылку
                    byte[] iv;
                    int    ivLength = br.ReadInt32();
                    iv           = br.ReadBytes(ivLength);
                    symmetric.IV = iv;
                }
            }
            catch (Exception exp)
            {
                Log.DssLogger.Error($"Ошибка при расшифровании симметричного ключа: {exp}");
                symmetric = null;
            }

            return(symmetric);
        }
Exemple #4
0
        private static Stream ReceiveEncryptedDataStream(AsymmetricAlgorithm privateKey, Stream encryptedDataStream, byte[] iv, byte[] sessionKey)
        {
            var decryptedDataStream = new MemoryStream();

            var deformatter = new GostKeyExchangeDeformatter(privateKey);

            // Получатель принимает от отправителя зашифрованный сессионный ключ и дешифрует его
            using (var receiverSessionKey = deformatter.DecryptKeyExchangeAlgorithm(sessionKey))
            {
                // Получатель принимает от отправителя вектор инициализации
                receiverSessionKey.IV = iv;

                // Получатель дешифрует данные с использованием сессионного ключа
                using (var decryptor = receiverSessionKey.CreateDecryptor())
                {
                    var cryptoStream = new CryptoStream(encryptedDataStream, decryptor, CryptoStreamMode.Read);
                    cryptoStream.CopyTo(decryptedDataStream);
                }
            }

            decryptedDataStream.Position = 0;

            return(decryptedDataStream);
        }