示例#1
0
        private static Stream SendEncryptedDataStream(AsymmetricAlgorithm publicKey, Stream dataStream, out byte[] iv, out byte[] sessionKey)
        {
            var encryptedDataStream = new MemoryStream();

            // Отправитель создает случайный сессионный ключ для шифрации данных
            using (var senderSessionKey = new Gost28147SymmetricAlgorithm())
            {
                // Отправитель передает получателю вектор инициализации
                iv = senderSessionKey.IV;

                // Отправитель шифрует сессионный ключ и передает его получателю
                var formatter = new GostKeyExchangeFormatter(publicKey);
                sessionKey = formatter.CreateKeyExchangeData(senderSessionKey);

                // Отправитель шифрует данные с использованием сессионного ключа
                using (var encryptor = senderSessionKey.CreateEncryptor())
                {
                    var cryptoStream = new CryptoStream(encryptedDataStream, encryptor, CryptoStreamMode.Write);
                    dataStream.CopyTo(cryptoStream);
                }
            }

            encryptedDataStream.Position = 0;

            return(encryptedDataStream);
        }
        /// <summary>
        /// Зашифровать симметричный ключ
        /// </summary>
        /// <param name="symmKey"></param>
        /// <param name="recipientName"></param>
        /// <returns></returns>
        public byte[] EncryptSymmKey(Gost28147 symmKey, string recipientName)
        {
            Log.DssLogger.Debug($"Шифрование симметричного ключа на получателя {recipientName}");

            byte[] returnArray;

            try
            {
                X509Certificate2 cert = _certificateService.FindAddressBookCertificateBySubjectName(recipientName)
                                        .Result;

                // Если ничего не нашли - выходим
                if (cert == null)
                {
                    return(null);
                }

                // Открытый ключ получателя.
                AsymmetricAlgorithm pk        = cert.PublicKey.Key;
                Gost3410            recipient = pk as Gost3410;
                if (recipient == null)
                {
                    throw new CryptographicException("Not a gost certificate");
                }

                GostKeyExchangeFormatter keyFormatter = new GostKeyExchangeFormatter(recipient);

                byte[] transport = keyFormatter.CreateKeyExchangeData(symmKey);

                // Создаем зашифрованный файл.
                using (MemoryStream ms = new MemoryStream())
                {
                    // Записываем зашифрованный симметричный ключ в виде транспортного представления.
                    BinaryWriter bw = new BinaryWriter(ms);
                    bw.Write(transport.Length);
                    bw.Write(transport);

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

                    returnArray = ms.ToArray();
                }
            }
            catch (Exception exp)
            {
                Log.DssLogger.Error($"Ошибка при зашифровании симметричного ключа: {exp}");
                returnArray = null;
            }

            return(returnArray);
        }
        public static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost3410AsymmetricAlgorithmBase publicKey)
        {
            if (sessionKey == null)
            {
                throw ExceptionUtility.ArgumentNull("sessionKey");
            }

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

            var formatter = new GostKeyExchangeFormatter(publicKey);

            return(formatter.CreateKeyExchangeData(sessionKey));
        }