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)); }