using System;using System.IO;using System.Security.Cryptography;using System.Xml;
namespace Hxh.API{ /// <summary> /// code by 黄新华 /// </summary> public class CryptoFile { private byte[] key; private byte[] iv; SymmetricAlgorithm symm;
public CryptoFile() { // // TODO: 在此处添加构造函数逻辑 // symm = new RijndaelManaged(); this.key=new byte[]{169,209,120,221,50,85,99,196,135,108,172,183,3,68,88,248,216,.........}; this.iv=new byte[]{99,182,112,161,26,185,11,55,140,224,81,21,............};
//Get the key and IV.
}
/// <summary> /// 读取加密文件到流 /// </summary> /// <param name="file"></param> /// <returns></returns> public XmlDocument Read(string file) {
FileStream fsIn = File.Open(file,FileMode.Open,FileAccess.Read); XmlDocument Xdoc=new XmlDocument();
ICryptoTransform transform = symm.CreateDecryptor(key,iv); CryptoStream cstream = new CryptoStream(fsIn,transform,CryptoStreamMode.Read); StreamReader sr=new StreamReader(cstream); Xdoc.Load(sr); fsIn.Close(); sr.Close(); return Xdoc;
}
/// <summary> /// 将流加密写入文件 /// </summary> /// <param name="fsIn"></param> /// <param name="fileName"></param> public void Write(ref XmlDocument Xdoc,string fileName) { FileStream fsOut = File.Open(fileName, FileMode.OpenOrCreate,FileAccess.Write); MemoryStream ms = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(ms, null); writer.Formatting = Formatting.Indented; Xdoc.Save(writer); ms.Seek(0,SeekOrigin.Begin);
ICryptoTransform transform = symm.CreateEncryptor(key,iv); CryptoStream cstream = new CryptoStream(fsOut,transform,CryptoStreamMode.Write); BinaryReader br = new BinaryReader(ms); // 读取源文件到cryptostream cstream.Write(br.ReadBytes((int)ms.Length),0,(int)ms.Length); cstream.FlushFinalBlock(); cstream.Close(); ms.Close(); fsOut.Close();
}
/// <summary> /// 加密一个存在的文件 /// </summary> /// <param name="file"></param> public void Encrypto(string file) { string tempfile = Path.GetTempFileName(); //打开指定的文件 FileStream fsIn = File.Open(file,FileMode.Open, FileAccess.Read); FileStream fsOut = File.Open(tempfile, FileMode.Open, FileAccess.Write); //定义对称算法对象实例和接口 ICryptoTransform transform = symm.CreateEncryptor(key,iv); CryptoStream cstream = new CryptoStream(fsOut,transform, CryptoStreamMode.Write);
BinaryReader br = new BinaryReader(fsIn); // 读取源文件到cryptostream cstream.Write(br.ReadBytes((int)fsIn.Length),0,(int)fsIn.Length); cstream.FlushFinalBlock(); cstream.Close(); fsIn.Close(); fsOut.Close();
File.Delete(file); File.Move(tempfile,file); }
/// <summary> /// 解密一个存在的文件 /// </summary> /// <param name="file"></param> public void Decrypto(string file) { string tempfile = Path.GetTempFileName(); //打开指定的文件 FileStream fsIn = File.Open(file,FileMode.Open, FileAccess.Read); FileStream fsOut = File.Open(tempfile, FileMode.Open, FileAccess.Write); //定义对称算法对象实例和接口 ICryptoTransform transform = symm.CreateDecryptor(key,iv); CryptoStream cstream = new CryptoStream(fsOut,transform, CryptoStreamMode.Write);
BinaryReader br = new BinaryReader(fsIn); // 读取源文件到cryptostream cstream.Write(br.ReadBytes((int)fsIn.Length),0,(int)fsIn.Length); cstream.FlushFinalBlock(); cstream.Close(); fsIn.Close(); fsOut.Close();
File.Delete(file); File.Move(tempfile,file);
}
/// <summary> /// 设置加密或解密的初始化向量 /// </summary> /// <param name="s">长度等于8的ASCII字符集的字符串</param> public void SetIV(string s) { if(s.Length != 8) { this.iv =null; return; } try { this.iv =System.Text.Encoding.Default.GetBytes(s); } catch(System.Exception) { this.iv = null; } } /// <summary> /// 设置加密或解密的密匙 /// </summary> /// <param name="s">长度等于16的ASCII字符集的字符串</param> public void SetKey(string s) { if(s.Length != 16) { this.key = null; return; } try { this.key = System.Text.Encoding.Default.GetBytes(s);
} catch(System.Exception) { this.key = null; } }
}}
