前言:
本文只介绍How to use,对于加密算法的研究不予讨论。
关于私钥的存储,微软给的建议是使用windows自带的秘钥容器,相见文档。
为了直观看到私钥和公钥,本文直接将其存入XML文件中。现实情况则要复杂的多,还牵涉到数字签名、数字证书等。
关于公钥、私钥、数字签名、数字证书的概念,相见阮一峰大神的博客,传送门在这里。
正文:
由于RSA不适合加密大量数据,所以可以采用DES和RSA混合加密的方法,即先用DES加密数据,再用RSA加密DES的秘钥。
RSAHelper 类
public class RSAHelper { /// <summary> /// 读取二进制文件 /// </summary> /// <param name="path"></param> /// <returns></returns> public static byte[] GetByte(string path) { FileInfo fi = new FileInfo(path); List<byte> buff = new List<byte>(); using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite)) { BinaryReader br = new BinaryReader(fs); try { while (true) { byte i = br.ReadByte(); buff.Add(i); } } catch (Exception) { br.Close(); } } return buff.ToArray(); } /// <summary> /// 读取文本文件 /// </summary> /// <param name="path"></param> /// <returns></returns> public static string GetText(string path) { FileInfo fi = new FileInfo(path); string content; using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite)) { StreamReader sr = new StreamReader(fs); content = sr.ReadToEnd(); sr.Close(); } return content; } /// <summary> /// 写入二进制文件 /// </summary> /// <param name="content"></param> /// <param name="path"></param> public static void WriteByte(byte[] content, string path) { FileInfo fi = new FileInfo(path); using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite)) { BinaryWriter br = new BinaryWriter(fs); br.Write(content); br.Flush(); br.Close(); } } /// <summary> /// 写入文本文件 /// </summary> /// <param name="content"></param> /// <param name="path"></param> public static void WriteText(string content, string path) { FileInfo fi = new FileInfo(path); using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite)) { StreamWriter sw = new StreamWriter(fs); sw.Write(content); sw.Flush(); sw.Close(); } } /// <summary> /// RSA加密/解密 /// </summary> /// <param name="data">加密/解密数据</param> /// <param name="key">公钥/私钥</param> /// <param name="isEncrypt">ture加密,false解密</param> /// <returns></returns> public static byte[] EncryptOrDecrypt(byte[] data, string key, bool isEncrypt) { RSACryptoServiceProvider rsaP = new RSACryptoServiceProvider(); rsaP.FromXmlString(key); if (isEncrypt)// 加密 { byte[] buff = rsaP.Encrypt(data, true); return buff; } else // 解密 { byte[] buff = rsaP.Decrypt(data, true); return buff; } } }