流扩展: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();
            }
        }
    }
}

 

posted on 2014-02-11 10:45  朝着  阅读(210)  评论(0编辑  收藏  举报