public static void Decrypt(Stream inputStream, Stream outputStream, EncryptedAesKey encryptedAesKey, RSAParameters receiverKey) { if (inputStream == null) { throw new ArgumentNullException(nameof(inputStream)); } if (encryptedAesKey == null) { throw new ArgumentNullException(nameof(encryptedAesKey)); } using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.ImportParameters(receiverKey); var decryptedKey = rsa.Decrypt(encryptedAesKey.EncryptedKey, false); var decryptedIv = rsa.Decrypt(encryptedAesKey.EncryptedIV, false); using (Aes aes = Aes.Create()) { if (aes == null) { throw new Exception("Error while initializing AES instance."); } aes.Key = decryptedKey; aes.IV = decryptedIv; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); inputStream.Position = 0; CryptoTransformStream(inputStream, outputStream, decryptor); } } }
public static Dictionary <string, EncryptedAesKey> Encrypt(Stream inputStream, Stream outputStream, List <Receiver> receiversList) { if (inputStream == null) { throw new ArgumentNullException(nameof(inputStream)); } if (receiversList == null) { throw new ArgumentNullException(nameof(receiversList)); } inputStream.Position = 0; using (Aes aes = Aes.Create()) { if (aes == null) { throw new Exception("Error while initializing AES instance."); } aes.GenerateKey(); aes.GenerateIV(); ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); CryptoTransformStream(inputStream, outputStream, encryptor); var encryptedKeys = new Dictionary <string, EncryptedAesKey>(); foreach (var receiver in receiversList) { using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.ImportParameters(receiver.RsaKey); var encryptedKey = rsa.Encrypt(aes.Key, false); var encryptedIv = rsa.Encrypt(aes.IV, false); var userAesKey = new EncryptedAesKey(encryptedKey, encryptedIv); encryptedKeys.Add(receiver.Email, userAesKey); } } return(encryptedKeys); } }