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();
}
}
}
}