转自:http://www.16aspx.com/Article/3904

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO; namespace SEDO
{
/// <summary>
/// SEDO 的摘要说明。
/// SEDO 实现的是用一个封装了4种对称加密方法(Des,Rc2,Rijndael,TripleDes)的组件
///
/// 注意事项:
/// 1:TripleDes和Rijndael加密/解密对象使用16或者24位byte的Key
/// 2:Rijndael只能使用16位的初始化向量IV
/// 3:Des和Rc2均使用8位Byte的Key和IV
/// 4:对需要加密/解密的数据流采用何种方法进行编码/解码,由调用组件的用户自己决定
/// 5:密钥和初始化向量IV由使用者自己定义
/// 程序员: 罗旭成2010-10-30 lxc880615@163.com
/// </summary> //定义加密类型的枚举
public enum EncryptionAlgorithm { Des = 1, Rc2, Rijndael, TripleDes }; //定义加密类
internal class EncryptTransformer
{
private EncryptionAlgorithm algorithmID;
private byte[] initVec;
private byte[] encKey; internal EncryptTransformer(EncryptionAlgorithm algId)
{
//Save the algorithm being used.
algorithmID = algId;
} internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
{
//当数据密钥Key或者初始化向量IV为空的时候,
//将使用加密对象自动产生的密钥Key或者初始化向量IV
switch (algorithmID)
{
case EncryptionAlgorithm.Des:
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.CBC; // See if a key was provided
if (null == bytesKey)
{
encKey = des.Key;
}
else
{
des.Key = bytesKey;
encKey = des.Key;
}
// See if the client provided an initialization vector
if (null == initVec)
{ // Have the algorithm create one
initVec = des.IV;
}
else
{ //No, give it to the algorithm
des.IV = initVec;
}
return des.CreateEncryptor();
}
case EncryptionAlgorithm.TripleDes:
{
TripleDES des3 = new TripleDESCryptoServiceProvider();
des3.Mode = CipherMode.CBC;
// See if a key was provided
if (null == bytesKey)
{
encKey = des3.Key;
}
else
{
des3.Key = bytesKey;
encKey = des3.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = des3.IV;
}
else
{ //No, give it to the alg.
des3.IV = initVec;
}
return des3.CreateEncryptor();
}
case EncryptionAlgorithm.Rc2:
{
RC2 rc2 = new RC2CryptoServiceProvider();
rc2.Mode = CipherMode.CBC;
// Test to see if a key was provided
if (null == bytesKey)
{
encKey = rc2.Key;
}
else
{
rc2.Key = bytesKey;
encKey = rc2.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = rc2.IV;
}
else
{ //No, give it to the alg.
rc2.IV = initVec;
}
return rc2.CreateEncryptor();
}
case EncryptionAlgorithm.Rijndael:
{
Rijndael rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
// Test to see if a key was provided
if (null == bytesKey)
{
encKey = rijndael.Key;
}
else
{
rijndael.Key = bytesKey;
encKey = rijndael.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = rijndael.IV;
}
else
{ //No, give it to the alg.
rijndael.IV = initVec;
}
return rijndael.CreateEncryptor();
}
default:
{
throw new CryptographicException("Algorithm ID ''" +
algorithmID +
"'' not supported.");
}
}
} //加密的偏移向量
internal byte[] IV
{
get { return initVec; }
set { initVec = value; }
}
//加密的密钥
internal byte[] Key
{
get { return encKey; }
set { encKey = value; }
} } //定义解密类
internal class DecryptTransformer
{
private EncryptionAlgorithm algorithmID;
private byte[] initVec;
private byte[] encKey; internal DecryptTransformer(EncryptionAlgorithm deCryptId)
{
algorithmID = deCryptId;
} //加密的偏移向量
internal byte[] IV
{
get { return initVec; }
set { initVec = value; }
} //加密的密钥
internal byte[] Key
{
get { return encKey; }
set { encKey = value; }
} internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
{
//当数据密钥Key或者初始化向量IV为空的时候,
//将使用加密对象自动产生的密钥Key或者初始化向量IV
switch (algorithmID)
{
case EncryptionAlgorithm.Des:
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.CBC;
des.Key = bytesKey;
des.IV = initVec;
return des.CreateDecryptor();
}
case EncryptionAlgorithm.TripleDes:
{
TripleDES des3 = new TripleDESCryptoServiceProvider();
des3.Mode = CipherMode.CBC;
return des3.CreateDecryptor(bytesKey, initVec);
}
case EncryptionAlgorithm.Rc2:
{
RC2 rc2 = new RC2CryptoServiceProvider();
rc2.Mode = CipherMode.CBC;
return rc2.CreateDecryptor(bytesKey, initVec);
}
case EncryptionAlgorithm.Rijndael:
{
Rijndael rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
return rijndael.CreateDecryptor(bytesKey, initVec);
}
default:
{
throw new CryptographicException("Algorithm ID ''" +
algorithmID +
"'' not supported.");
}
}
} //end GetCryptoServiceProvider } //定义加密者类
public class Encryptor
{
private EncryptTransformer transformer;
private byte[] initVec;
private byte[] encKey; public Encryptor(EncryptionAlgorithm algId)
{
transformer = new EncryptTransformer(algId);
} public byte[] Encrypt(byte[] bytesData, byte[] bytesKey, byte[] bytesIV)
{
//设置流对象用来保存加密数据字节流.
MemoryStream memStreamEncryptedData = new MemoryStream(); transformer.IV = bytesIV;
transformer.Key = bytesKey; ICryptoTransform transform =
transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream encStream =
new CryptoStream(memStreamEncryptedData,
transform, CryptoStreamMode.Write); try
{
//将加密数据写进流对象
encStream.Write(bytesData, 0, bytesData.Length);
}
catch (Exception ex)
{
throw new Exception("在数据加密的时候出现错误!"+
"错误提示: \n" + ex.Message);
} //设置加密的Key和初始向量IV属性
encKey = transformer.Key;
initVec = transformer.IV; encStream.FlushFinalBlock();
encStream.Close(); //Send the data back.
return memStreamEncryptedData.ToArray();
} public byte[] IV
{
get { return initVec; }
set { initVec = value; }
} public byte[] Key
{
get { return encKey; }
set { encKey = value; }
} } //定义解密者类
public class Decryptor
{
private DecryptTransformer transformer;
private byte[] initVec;
private byte[] encKey; public Decryptor(EncryptionAlgorithm algId)
{
transformer = new DecryptTransformer(algId);
} public byte[] Decrypt(byte[] bytesData,
byte[] bytesKey, byte[] bytesIV)
{
//设置流对象用来保存解密数据字节流.
MemoryStream memStreamDecryptedData =
new MemoryStream(); //Pass in the initialization vector.
transformer.IV = bytesIV;
transformer.Key = bytesKey; ICryptoTransform transform =
transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream decStream =
new CryptoStream(memStreamDecryptedData,
transform, CryptoStreamMode.Write); try
{
decStream.Write(bytesData, 0, bytesData.Length);
}
catch (Exception ex)
{
throw new Exception("在数据解密的时候出现错误!"+
"错误提示: \n" + ex.Message);
}
decStream.FlushFinalBlock();
decStream.Close();
// 返回解密数据.
return memStreamDecryptedData.ToArray();
} public byte[] IV
{
get { return initVec; }
set { initVec = value; }
} public byte[] Key
{
get { return encKey; }
set { encKey = value; }
} } //类描述:文件加密/解密类
public class SecurityFile
{
private DecryptTransformer Dec_Transformer; //解密转换器
private EncryptTransformer Enc_Transformer; //加密转换器
private byte[] initVec;
private byte[] encKey; public SecurityFile(EncryptionAlgorithm algId)
{
Dec_Transformer = new DecryptTransformer(algId);
Enc_Transformer = new EncryptTransformer(algId);
} //加密的偏移向量
internal byte[] IV
{
get { return initVec; }
set { initVec = value; }
}
//加密的密钥
internal byte[] Key
{
get { return encKey; }
set { encKey = value; }
} //功能描述:加密文件
public void EncryptFile(string inFileName,
string outFileName, byte[] bytesKey, byte[] bytesIV)
{
try
{
FileStream fin =
new FileStream(inFileName, FileMode.Open,
FileAccess.Read);
FileStream fout = new FileStream(outFileName,
FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0); //Create variables to help with read and write.
//This is intermediate storage for the encryption.
byte[] bin = new byte[100];
//This is the total number of bytes written.
long rdlen = 0;
//This is the total length of the input file.
long totlen = fin.Length;
//This is the number of bytes to be written at a time.
int len; Enc_Transformer.IV = bytesIV;
Enc_Transformer.Key = bytesKey; ICryptoTransform transform =
Enc_Transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream encStream =
new CryptoStream(fout, transform, CryptoStreamMode.Write); //Read from the input file, then encrypt and write to the output file.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
} encStream.Close();
fout.Close();
fin.Close();
}
catch (Exception ex)
{
throw new Exception("在文件加密的时候出现错误!"+
"错误提示: \n" + ex.Message);
}
} //功能描述:解密文件
public void DecryptFile(string inFileName,
string outFileName, byte[] bytesKey, byte[] bytesIV)
{
try
{
FileStream fin =
new FileStream(inFileName, FileMode.Open,
FileAccess.Read);
FileStream fout =
new FileStream(outFileName,
FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0); //Create variables to help with read and write.
//This is intermediate storage for the encryption.
byte[] bin = new byte[100];
//This is the total number of bytes written.
long rdlen = 0;
//This is the total length of the input file.
long totlen = fin.Length;
//This is the number of bytes to be written at a time.
int len; Dec_Transformer.IV = bytesIV;
Dec_Transformer.Key = bytesKey; ICryptoTransform transform =
Dec_Transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream encStream =
new CryptoStream(fout, transform, CryptoStreamMode.Write); //Read from the input file, then encrypt and
//write to the output file.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}
encStream.Close();
fout.Close();
fin.Close();
}
catch (Exception ex)
{
throw new Exception("在文件加密的时候出现"+
"错误!错误提示: \n" + ex.Message);
}
}
}
}

C#做的一个加密/解密的类的更多相关文章

  1. php加密解密功能类

    这两天突发奇想想要用php写一个对日常项目加密以及解密的功能,经过努力简单的封装了一个对php代码进行加密解密的类,一些思想也是来自于网络,初步测试用着还行,可以实现对指定项目的加密以及解密(只针对本 ...

  2. C# MD5加密解密帮助类

    /// <summary>    /// MD5加密解密帮助类    /// </summary>    public static class DESHelper    {  ...

  3. php加密解密处理类

    [PHP]代码 <?php /*=========================================================== = 版权协议: = GPL (The GN ...

  4. AES加密解密 助手类 CBC加密模式

    "; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...

  5. .Net(c#)加密解密工具类:

    /// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...

  6. Base64加密解密工具类

    使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...

  7. java 加密解密工具类(实用!!!)

    最近发现了一个加密解密的好例子,很方便使用,可以作为平时开发的工具集,记录一下. package com.sh.springboottdemo2.util; import com.sun.org.ap ...

  8. des 加密解密工具类

    最近在做des的双对称加密解密,特此记录一下. des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码 ...

  9. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

随机推荐

  1. Google Chrome中的高性能网络(二)

    Chrome Predictor的预测功能优化 Chrome会随着使用变得更快. 它这个特性是通过一个单例对象Predictor来实现的.这个对象在浏览器内核进程(Browser Kernel Pro ...

  2. If-Modified-Since & If-None-Match

    google告诉网站站长:您的网络服务器支持 If-Modified-Since HTTP 标头.通过该功能,您的网络服务器可以告诉 Google 自上次抓取您的网站以来,内容是否已发生变化.该功能可 ...

  3. Mysql监控工具小集合

    介绍一些常见的Mysql监控工具. Cacti Cacti是 一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.它通过snmpget来获取数据,使用 RRDtool绘 ...

  4. zookeeper环境的搭建

    接管条件:磁盘上原数据完全一样,而自动接管,则是由zookeeper 实现的 FailloverController:控制namenode状态:检查namenode:通过远程协议

  5. 中断下半部-tasklet

    http://edsionte.com/techblog/ tasklet的实现 tasklet(小任务)机制是中断处理下半部分最常用的一种方法,其使用也是非常简单的.正如在前文中你所知道的那样,一个 ...

  6. Installing your app on your Windows RT device

    Alright… so my app is almost finished and I want to install it for real on my Surface tablet. How do ...

  7. .NET Compact Framework Data Provider for SQL Server CE

    .NET Compact Framework Data Provider for SQL Server Mobile Standard Data Source=MyData.sdf;Persist S ...

  8. 教程-MessageBox 使用方法

    对应对象:TApplication 声明:function MessageBox(Text,Caption:PChar;Flags:Word):Integer; 功能:MessageBox方法可以显示 ...

  9. lab 1实验报告

    练习1:理解通过make生成执行文件的过程. 1.操作系统镜像文件ucore.img是如何一步一步生成的? 生成 bin/kern 部分 生成 init.o 生成 readline.o 生成 stdi ...

  10. html的框架