コード例 #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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
ファイル: GostKeyExchangeTests.cs プロジェクト: Trivin/corefx
        public void TestKeyExchange2012_256()
        {
            // Ассиметричный ключ получателя.
            Gost3410_2012_256 AssymKey;

            // Синхропосылка.
            byte[] IV;

            // Создаем случайный открытый ключ.
            using (Gost3410_2012_256 gkey = GetGostProvider2012_256())
            {
                AssymKey = gkey;

                // Создаем случайный секретный ключ, который необходимо передать.
                Gost28147 key = new Gost28147CryptoServiceProvider();
                // Синхропосылка не входит в GostKeyTransport и должна
                // передаваться отдельно.
                IV = key.IV;

                // Создаем форматтер, шифрующий на ассиметричном ключе получателя.
                GostKeyExchangeFormatter Formatter = new GostKeyExchangeFormatter(AssymKey);
                // GostKeyTransport - формат зашифрованной для безопасной передачи
                // ключевой информации.
                GostKeyTransport encKey = Formatter.CreateKeyExchange(key);

                // Шифруемая строка
                string message     = "012345678901234567890";
                byte[] sourceBytes = Encoding.ASCII.GetBytes(message);
                Console.WriteLine("** Строка до шифрования: " + message);

                // Шифруем строку на сессионном ключе
                byte[] encBytes = GostEncrypt(key, sourceBytes);
                Console.WriteLine("** Строка после шифрования: " +
                                  Encoding.ASCII.GetString(encBytes));

                // Получатель расшифровывает GostKeyTransport и само сообщение.
                byte[] decBytes = GostDecrypt(encKey, encBytes, IV, AssymKey);
                Console.WriteLine("** Строка после расшифрования: " +
                                  Encoding.ASCII.GetString(decBytes));

                Assert.Equal(sourceBytes, decBytes);
            }
        }