在.net中,对类使用[Serializable]属性可方便的将其实例序列化。若使用二进制序列化,保存的文件用记事本打开可以看到其大概结构和数据。使用CryptoStream类做加密就能隐藏序列化后的数据。下面是本人写的一个对.Net对象做加密序列化及解密反序列化的类,与大家分享。.Net对象的序列化及加密存取类 下载
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
namespace ObjFileStore
{
class ObjFileStore
{
const string keyStr = "yourkey"; //加密的KEY字符,用MD5码生成128位KEY密钥
const string ivStr = "youriv"; //加密的IV字符,用MD5码生成128位IV密钥
public ObjFileStore()
{ }
/// <summary>
/// 将对象保存为文件
/// </summary>
/// <param name="uFilename">文件名及地址</param>
/// <param name="uTarget">保存对象,需[Serializable]</param>
static public void SaveObj(string uFilename, object uTarget)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream mStream = new MemoryStream();
formatter.Serialize(mStream, uTarget);
Rijndael rijn = Rijndael.Create();
MD5 md5 = MD5.Create();
byte[] Key = md5.ComputeHash(Encoding.ASCII.GetBytes(keyStr));
byte[] IV = md5.ComputeHash(Encoding.ASCII.GetBytes(ivStr));
FileStream fStream = new FileStream(uFilename, FileMode.Create, FileAccess.Write,
FileShare.None);
CryptoStream cStream = new CryptoStream(fStream, rijn.CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
StreamWriter sWriter = new StreamWriter(cStream, Encoding.ASCII);
char[] data = Encoding.ASCII.GetChars(mStream.ToArray());
sWriter.Write(data);
sWriter.Flush();
sWriter.Close();
cStream.Close();
fStream.Close();
mStream.Close();
}
/// <summary>
/// 从文件读取对象
/// </summary>
/// <param name="uFilename">文件名及地址</param>
/// <returns>反序列化后的对象,类型为object</returns>
static public object LoadObj(string uFilename)
{
IFormatter formatter = new BinaryFormatter();
Rijndael rijn = Rijndael.Create();
MD5 md5 = MD5.Create();
byte[] Key = md5.ComputeHash(Encoding.ASCII.GetBytes(keyStr));
byte[] IV = md5.ComputeHash(Encoding.ASCII.GetBytes(ivStr));
FileStream fStream = new FileStream(uFilename, FileMode.Open, FileAccess.Read,
FileShare.Read);
CryptoStream cStream = new CryptoStream(fStream, rijn.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
StreamReader sReader = new StreamReader(cStream);
string ftxt = sReader.ReadToEnd();
byte[] bytes = Encoding.ASCII.GetBytes(ftxt);
MemoryStream mStream = new MemoryStream(bytes);
object result = formatter.Deserialize(mStream);
sReader.Close();
cStream.Close();
fStream.Close();
mStream.Close();
return result;
}
}
}