// Действия получателя - расшифровываем полученные сессионный ключ и сообщение. 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); }
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); }