/// <summary> /// 流数据加密 /// </summary> /// <param name="data">数据</param> /// <param name="proEntity">加密配置</param> /// <returns>加密后流数据,返回MemoryStream</returns> /// <exception cref="ArgumentNullException">当加密配置为null时抛出此异常</exception> /// <exception cref="Exception">此方法只支持对称加密,如果使用非对称配置,抛出此异常</exception> public static Stream Encrypt(Stream data, EncryptionConfigEntity proEntity) { if (proEntity == null) { throw new ArgumentNullException("proEntity"); } if (proEntity.SymmetricAlgorithm == false) { throw new Exception("This method id not intended for asymmetric encryption"); } //retrive the secret key and iv information var provider = proEntity.AlgorithmProvider.CreateInstance <SymmetricAlgorithm>(); provider.Key = Decryption.Base64ToBytes(proEntity.ExtentProperty["Key"]); provider.IV = Decryption.Base64ToBytes(proEntity.ExtentProperty["IV"]); var encryptor = provider.CreateEncryptor(); var encrypted = new MemoryStream(); //encrypt the stream symmetrically var encStream = new CryptoStream(encrypted, encryptor, CryptoStreamMode.Write); var buffer = new byte[1024]; int count; while ((count = data.Read(buffer, 0, 1024)) > 0) { encStream.Write(buffer, 0, count); } encStream.FlushFinalBlock(); encrypted.Position = 0; return(encrypted); }
/// <summary> /// 解密数据 /// </summary> /// <param name="data">待解密流数据</param> /// <param name="proEntity">解密配置</param> /// <returns>解密后流数据,返回MemoryStream</returns> /// <exception cref="ArgumentNullException">当解密配置为null时抛出此异常</exception> /// <exception cref="Exception">此方法只支持对称解密,如果使用非对称配置,抛出此异常</exception> public static Stream Decrypt(Stream data, EncryptionConfigEntity proEntity) { if (proEntity == null) { throw new ArgumentNullException("proEntity"); } if (proEntity.SymmetricAlgorithm != true) { throw new Exception("This method id not intended for asymmetric encryption"); } //retrieve the secret key and iv from the configuration file var provider = proEntity.AlgorithmProvider.CreateInstance <SymmetricAlgorithm>(); var key = proEntity.ExtentProperty["Key"]; var iv = proEntity.ExtentProperty["IV"]; provider.Key = Decryption.Base64ToBytes(key); provider.IV = Decryption.Base64ToBytes(iv); var decryptor = provider.CreateDecryptor(); //decrypt the stream var decStream = new CryptoStream(data, decryptor, CryptoStreamMode.Read); var decrypted = new MemoryStream(); var buffer = new byte[2048]; int count; while ((count = decStream.Read(buffer, 0, buffer.Length)) != 0) { decrypted.Write(buffer, 0, count); } decrypted.Position = 0; return(decrypted); }