流扩展:StreamExtensions
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; namespace Beehive.CloudReader.Utility { /// <summary> /// Stream 扩展 /// </summary> public static class StreamExtensions { /// <summary> /// /// </summary> /// <typeparam name="Algorithm"></typeparam> /// <param name="stream"></param> /// <param name="key"></param> /// <returns></returns> public static System.IO.Stream Encrypt<Algorithm>(this System.IO.Stream stream, byte[] key) where Algorithm : SymmetricAlgorithm { var alg = Activator.CreateInstance<Algorithm>(); PasswordDeriveBytes pdb = new PasswordDeriveBytes(key, null); alg.Key = pdb.GetBytes(alg.KeySize / 8); alg.GenerateIV(); alg.IV = pdb.GetBytes(alg.IV.Length); ICryptoTransform encryptor = alg.CreateEncryptor(); return new CryptoStream(stream, encryptor, CryptoStreamMode.Read); } /// <summary> /// /// </summary> /// <typeparam name="Algorithm"></typeparam> /// <param name="stream"></param> /// <param name="key"></param> /// <returns></returns> public static System.IO.Stream Decrypt<Algorithm>(this System.IO.Stream stream, byte[] key) where Algorithm : SymmetricAlgorithm { var alg = Activator.CreateInstance<Algorithm>(); PasswordDeriveBytes pdb = new PasswordDeriveBytes(key, null); alg.Key = pdb.GetBytes(alg.KeySize / 8); alg.GenerateIV(); alg.IV = pdb.GetBytes(alg.IV.Length); ICryptoTransform encryptor = alg.CreateDecryptor(); return new CryptoStream(stream, encryptor, CryptoStreamMode.Read); } /// <summary> /// /// </summary> /// <param name="stream"></param> /// <returns></returns> public static byte[] ToByteArray(this System.IO.Stream stream) { byte[] buffer = new byte[1000]; int readLength = 1; using (MemoryStream ms = new MemoryStream()) { while (readLength > 0) { readLength = stream.Read(buffer, 0, buffer.Length); if (readLength > 0) ms.Write(buffer, 0, readLength); } return ms.ToArray(); } } } }