Exemplo n.º 1
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);
        }