我自己的超强的XML文档加密类

using System;
using System.IO;
using System.Security.Cryptography;
using System.Xml;
using System.Data;

namespace Hxh.Api
{
 /// <summary>
 /// CryptoFile 的摘要说明。
 /// </summary>
 public class CryptoFile
 {
  private byte[] key;
  private byte[] iv;
  SymmetricAlgorithm symm;

  public CryptoFile()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
   symm = new RijndaelManaged();
   this.key=new byte[]{。。。。。};
   this.iv=new byte[]{。。。};

   //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,System.Text.Encoding.UTF8);
   Xdoc.Load(sr);
   fsIn.Close();
   sr.Close();
   return Xdoc;
  }

  public DataSet ReadXml(string file)
  {
   FileStream fsIn = File.Open(file,FileMode.Open,FileAccess.Read);
   DataSet ds = new DataSet();

   ICryptoTransform transform = symm.CreateDecryptor(key,iv);
   CryptoStream cstream = new CryptoStream(fsIn,transform,CryptoStreamMode.Read);
   StreamReader sr=new StreamReader(cstream,System.Text.Encoding.UTF8);
   ds.ReadXml(sr,XmlReadMode.Auto);
   fsIn.Close();
   sr.Close();
   return ds;
  }

  /// <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,System.Text.Encoding.UTF8);
   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();

  }

  public void WriteXml(DataSet ds,string fileName)
  {
   FileStream fsOut = File.Open(fileName, FileMode.OpenOrCreate,FileAccess.Write);
   MemoryStream ms = new MemoryStream();
   XmlTextWriter writer = new XmlTextWriter(ms,System.Text.Encoding.UTF8);
   writer.Formatting = Formatting.Indented;
   ds.WriteXml(writer,XmlWriteMode.WriteSchema);
   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;
   }
  }

 }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xml加密XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密xml的初始内容将被替换,但其xml格式仍然被完好的保留。 介绍 我们有3个加密xml的方法 1、仅仅使用对称加密的方法加密xml 这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥。因为这个密钥不会在被加密xml中保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取。 2、使用对称加密和非对称加密相结合的方法来加密xml 这种方法需要一个用于加密数据的对称密钥和一个用于保护这个对称密钥的非对称密钥。被加密的对称密钥和被加密的数据一起保存在xml文档中。当用私有非对称密钥解密密钥的时候要用公开非对称密钥对密钥进行加密。 本文就将使用这种方法。想学到其他更多的方法请参看MSDN等到更多的信息。 (译者注:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。) 3、使用X.509加密xml,这种方法是用X.509作为非对称密钥,它由诸如VeriSign之类的第三方提供。 方法 不管xml加密是如何完成的,保存加密数据总是用两种方法之一。 1、加密后所有的元素都被命名为 2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值