///////////////////////////////////////////////////////////// //Author: stardicky // //E-mail: [email protected] // //QQNumber: 9531511 // //Company: Ezone International // //Class: HBS-0308 // //title: 利用密码系统保证数据安全 // ///////////////////////////////////////////////////////////// //介绍: // // 这是一个非常有趣的例子! // // 在Ezone International公司里Ting是Dicky的女友,Viisen是// //他们的上级.Viisen不允许公司内部员工谈恋爱,上有政策,下有对// //策,Ting和Dicky利用空闲时间通过邮件的方式与对方通讯,Viisen// //下发任务给Dicky的方式也是通过发送邮件.为了保存邮件的安全 // //性,邮件采用RC2(对称加密)加密方式进行发送,RC2的密钥经过RSA// //(非对称加密)的加密.Ting,Dicky和Viisen各自有一对公钥和密钥// //.Ting和Dicky的通讯内容对于Viisen是不可见的,Dicky和Viisen // //的通讯内容对于Ting是不可见的. // ///////////////////////////////////////////////////////////// using System; using System.IO; using System.Text; using System.Security.Cryptography; namespace EzoneSecuritySystem { class EzoneSecurityDemo { //创建三个员工对象,分别是 Dicky, Ting, Viisen public static EzonePerson Dicky=new EzonePerson("Dicky"); public static EzonePerson Ting=new EzonePerson("Ting"); public static EzonePerson Viisen=new EzonePerson("Viisen"); [STAThread] public static void Main(string[] args) { Console.WriteLine("==================== 场景一: Dicky给自己发送邮件消息 ===================="); Scene_1(); Console.WriteLine("========================================================================="); Console.Write("按任意键继续......"); Console.In.ReadLine(); Console.WriteLine("==================== 场景二: Dicky给Ting发送邮件消息 ===================="); Scene_2(); Console.WriteLine("========================================================================="); Console.Write("按任意键继续......"); Console.In.ReadLine(); Console.WriteLine("================ 场景三: Dicky给Ting ,Viisen发送邮件消息 ================"); Scene_3(); Console.WriteLine("========================================================================="); Console.Write("按任意键继续......"); Console.In.ReadLine(); } /// <summary> /// Dicky给自己发送邮件消息 /// </summary> public static void Scene_1() { Console.WriteLine("Dicky用自己的公钥加密信息"); EzoneMessage DickyMessage=Dicky.EncryptMessage("我今天努力了吗?"); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Dicky用自己的私钥解密消息"); Dicky.DecryptMessage(DickyMessage); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Viisen试图用自己的私钥解密消息"); Viisen.DecryptMessage(DickyMessage); Console.WriteLine(System.Environment.NewLine); } /// <summary> /// Dicky给Ting发送邮件消息 /// </summary> public static void Scene_2() { Console.WriteLine("Dicky获得Ting的公钥"); Dicky.GetPublicKey(Ting); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Dicky用Ting的公钥加密信息"); EzoneMessage TingMessage=Dicky.EncryptMessage("今晚一起吃饭好吗?"); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Ting用自己的私钥解密信息"); Ting.DecryptMessage(TingMessage); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Viisen试图用自己的私钥解密消息"); Viisen.DecryptMessage(TingMessage); Console.WriteLine(System.Environment.NewLine); } /// <summary> /// Dicky给Ting,Viisen发送邮件消息 /// </summary> public static void Scene_3() { Console.WriteLine("Dicky获得Ting的公钥"); Dicky.GetPublicKey(Ting); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Dicky用Ting的公钥加密信息"); EzoneMessage TingMessage=Dicky.EncryptMessage("I love you!"); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Dicky获得Viisen的公钥"); Dicky.GetPublicKey(Viisen); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Dicky用Viisen的公钥加密信息"); EzoneMessage ViisenMessage=Dicky.EncryptMessage("2003年度的财务总结报告放在你的办公桌上!"); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Ting用自己的私钥解密信息"); Ting.DecryptMessage(TingMessage); Console.WriteLine(System.Environment.NewLine); Console.WriteLine("Viisen用自己的私钥解密信息"); Viisen.DecryptMessage(ViisenMessage); Console.WriteLine(System.Environment.NewLine); } } //邮件对象 class EzoneMessage { public byte[] MessageBody;//邮件内容(内容通过RC2(对称加密)加密过的) public byte[] RC2Key; //RC2的密钥(通过RSA(非对称加密)加密过的) public byte[] RC2IV; //RC2的初始化向量 } //员工对象 class EzonePerson { //RSA(非对称加密对象) private RSACryptoServiceProvider EzoneRSA; //RC2(对称机密对象) private RC2CryptoServiceProvider EzoneRC2; //员工姓名 private string Name; //Person构造方法 public EzonePerson(string Name) { //初始化成员对象 this.EzoneRSA=new RSACryptoServiceProvider(); this.EzoneRC2=new RC2CryptoServiceProvider(); this.Name=Name; } //发送公钥 public RSAParameters SendPublicKey() { //RSA的公钥和密钥对象 RSAParameters result=new RSAParameters(); //导出EzoneRSA的公钥(false 表示不导出私钥) result=this.EzoneRSA.ExportParameters(false); return result; } //获得公钥 public void GetPublicKey(EzonePerson Obj) { //导入 EzonePerson对象 的公钥 this.EzoneRSA.ImportParameters(Obj.SendPublicKey()); } //加密邮件 public EzoneMessage EncryptMessage(string text) { EzoneMessage MessageObj=new EzoneMessage(); //将消息从字符串的形式转换成字节数组的形式 byte[] MessageBytes=System.Text.Encoding.UTF8.GetBytes(text); //随机创建RC2的密钥 this.EzoneRC2.GenerateKey(); //随机创建RC2的初始化向量 this.EzoneRC2.GenerateIV(); //用RSA加密RC2的密钥,并赋值给消息对象的RC2的密钥匙(false 表示不用OAEP进行填充,只有WinXp以上版本的*作系统才支持) MessageObj.RC2Key=this.EzoneRSA.Encrypt(this.EzoneRC2.Key,false); //给消息对象的RC2的向量赋值 MessageObj.RC2IV=this.EzoneRC2.IV; //创建一个加密对象 ICryptoTransform MyEncryptor=this.EzoneRC2.CreateEncryptor(); //创建一个内存流 MemoryStream EzoneMemoryStream=new MemoryStream(); //在内存流的基础上创建一个加密流对象 CryptoStream MyEncryptoStream=new CryptoStream(EzoneMemoryStream,MyEncryptor,CryptoStreamMode.Write); //向加密流中写入邮件内容 MyEncryptoStream.Write(MessageBytes,0,MessageBytes.Length); //刷新加密流的缓冲区 MyEncryptoStream.FlushFinalBlock(); //给消息对象的MessageBody(消息主体)赋值(经过RC2加密过的字节数组) MessageObj.MessageBody=EzoneMemoryStream.ToArray(); EzoneMemoryStream.Close(); MyEncryptoStream.Close(); //返回EzoneMessage对象 return MessageObj; } //解密邮件 public void DecryptMessage(EzoneMessage obj) { this.EzoneRC2.IV=obj.RC2IV; try { //用RSA解密RC2的密钥(false 表示不用OAEP进行填充,只有WinXp以上版本的*作系统才支持) this.EzoneRC2.Key=this.EzoneRSA.Decrypt(obj.RC2Key,false); } catch(CryptographicException e) { Console.WriteLine("解密失败: "+e.Message); return; } //创建一个解密对象 ICryptoTransform MyDecryptor=this.EzoneRC2.CreateDecryptor(); //创建一个内存流,用obj的邮件消息初始化内存流! MemoryStream EzoneMemoryStream=new MemoryStream(obj.MessageBody); //在内存流的基础上创建一个解密流对象 CryptoStream MyDecryptoStream=new CryptoStream(EzoneMemoryStream,MyDecryptor,CryptoStreamMode.Read); //存储解密后的邮件内容 byte[] MessageText=new byte[obj.MessageBody.Length]; //从解密流解密数据,并把解密过的数据写入到MessageText字节数组中 MyDecryptoStream.Read(MessageText,0,MessageText.Length); EzoneMemoryStream.Close(); MyDecryptoStream.Close(); Console.WriteLine("解密成功:"+System.Text.Encoding.UTF8.GetString(MessageText)); } } } |
本文地址:http://com.8s8s.com/it/it44988.htm