您的位置:首页 > 编程语言 > ASP

Asp.Net 文件加解密

2016-01-25 12:06 585 查看
using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Security.Cryptography;

using System.Text;

using System.Threading.Tasks;

namespace PD.Common

{

public static class AES

{

#region 加密

#region 加密字符串

/// <summary>

/// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

/// </summary>

/// <param name="EncryptString">待加密密文</param>

/// <param name="EncryptKey">加密密钥</param>

public static string AESEncrypt(string EncryptString, string EncryptKey)

{

return Convert.ToBase64String(AESEncrypt(Encoding.Default.GetBytes(EncryptString), EncryptKey));

}

#endregion

#region 加密字节数组

/// <summary>

/// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

/// </summary>

/// <param name="EncryptString">待加密密文</param>

/// <param name="EncryptKey">加密密钥</param>

public static byte[] AESEncrypt(byte[] EncryptByte, string EncryptKey)

{

if (EncryptByte.Length == 0) { throw (new Exception("明文不得为空")); }

if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

byte[] m_strEncrypt;

byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");

byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");

Rijndael m_AESProvider = Rijndael.Create();

try

{

MemoryStream m_stream = new MemoryStream();

PasswordDeriveBytes pdb = new PasswordDeriveBytes(EncryptKey, m_salt);

ICryptoTransform transform = m_AESProvider.CreateEncryptor(pdb.GetBytes(32), m_btIV);

CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);

m_csstream.Write(EncryptByte, 0, EncryptByte.Length);

m_csstream.FlushFinalBlock();

m_strEncrypt = m_stream.ToArray();

m_stream.Close(); m_stream.Dispose();

m_csstream.Close(); m_csstream.Dispose();

}

catch (IOException ex) { throw ex; }

catch (CryptographicException ex) { throw ex; }

catch (ArgumentException ex) { throw ex; }

catch (Exception ex) { throw ex; }

finally { m_AESProvider.Clear(); }

return m_strEncrypt;

}

#endregion

#endregion

#region 解密

#region 解密字符串

/// <summary>

/// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

/// </summary>

/// <param name="DecryptString">待解密密文</param>

/// <param name="DecryptKey">解密密钥</param>

public static string AESDecrypt(string DecryptString, string DecryptKey)

{

return Convert.ToBase64String(AESDecrypt(Encoding.Default.GetBytes(DecryptString), DecryptKey));

}

#endregion

#region 解密字节数组

/// <summary>

/// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

/// </summary>

/// <param name="DecryptString">待解密密文</param>

/// <param name="DecryptKey">解密密钥</param>

public static byte[] AESDecrypt(byte[] DecryptByte, string DecryptKey)

{

if (DecryptByte.Length == 0) { throw (new Exception("密文不得为空")); }

if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

byte[] m_strDecrypt;

byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");

byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");

Rijndael m_AESProvider = Rijndael.Create();

try

{

MemoryStream m_stream = new MemoryStream();

PasswordDeriveBytes pdb = new PasswordDeriveBytes(DecryptKey, m_salt);

ICryptoTransform transform = m_AESProvider.CreateDecryptor(pdb.GetBytes(32), m_btIV);

CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);

m_csstream.Write(DecryptByte, 0, DecryptByte.Length);

m_csstream.FlushFinalBlock();

m_strDecrypt = m_stream.ToArray();

m_stream.Close(); m_stream.Dispose();

m_csstream.Close(); m_csstream.Dispose();

}

catch (IOException ex) { throw ex; }

catch (CryptographicException ex) { throw ex; }

catch (ArgumentException ex) { throw ex; }

catch (Exception ex) { throw ex; }

finally { m_AESProvider.Clear(); }

return m_strDecrypt;

}

#endregion

#endregion

}

}

[csharp] view
plain copy

print?

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace PD.Common

{

public class FileEncrypt

{

#region 变量

/// <summary>

/// 一次处理的明文字节数

/// </summary>

public static readonly int encryptSize = 10000000;

/// <summary>

/// 一次处理的密文字节数

/// </summary>

public static readonly int decryptSize = 10000016;

#endregion

#region 加密文件

/// <summary>

/// 加密文件

/// </summary>

public static void EncryptFile(string Inputpath, string Outputpath, string pwd)

{

try

{

if (File.Exists(Inputpath))

{

using (FileStream fs = new FileStream(Inputpath, FileMode.Open, FileAccess.Read))

{

if (fs.Length > 0)

{

using (FileStream fsnew = new FileStream(Outputpath, FileMode.OpenOrCreate, FileAccess.Write))

{

//if (File.Exists(path + ".temp")) File.SetAttributes(path + ".temp", FileAttributes.Hidden);

int blockCount = ((int)fs.Length - 1) / encryptSize + 1;

for (int i = 0; i < blockCount; i++)

{

int size = encryptSize;

if (i == blockCount - 1) size = (int)(fs.Length - i * encryptSize);

byte[] bArr = new byte[size];

fs.Read(bArr, 0, size);

byte[] result = AES.AESEncrypt(bArr, pwd);

fsnew.Write(result, 0, result.Length);

fsnew.Flush();

}

fsnew.Close();

fsnew.Dispose();

}

fs.Close();

fs.Dispose();

}

}

}

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

#region 解密文件

/// <summary>

/// 解密文件

/// </summary>

public static void DecryptFile(string Inputpath, string Outputpath, string pwd)

{

try

{

if (File.Exists(Inputpath))

{

using (FileStream fs = new FileStream(Inputpath, FileMode.Open, FileAccess.Read))

{

if (fs.Length > 0)

{

using (FileStream fsnew = new FileStream(Outputpath, FileMode.OpenOrCreate, FileAccess.Write))

{

int blockCount = ((int)fs.Length - 1) / decryptSize + 1;

for (int i = 0; i < blockCount; i++)

{

int size = decryptSize;

if (i == blockCount - 1) size = (int)(fs.Length - i * decryptSize);

byte[] bArr = new byte[size];

fs.Read(bArr, 0, size);

byte[] result = AES.AESDecrypt(bArr, pwd);

fsnew.Write(result, 0, result.Length);

fsnew.Flush();

}

fsnew.Close();

fsnew.Dispose();

}

fs.Close();

fs.Dispose();

}

}

}

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: