这是一个非常有趣的例子!(DotNET密码系统)

类别:.NET开发 点击:0 评论:0 推荐:
(亿众国际-009)[原创]这是一个非常有趣的例子!

/////////////////////////////////////////////////////////////
//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