zoukankan      html  css  js  c++  java
  • 这是一个非常有趣的例子!(DotNET密码系统)

    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));
               }
         }
    }

  • 相关阅读:
    Android vector标签 PathData 画图超详解
    Echarts 出现不明竖线解决方案
    关于华为手机Log.d打印不出来log的问题
    Java源码解读(一)——HashMap
    算法小题
    Python简单小程序练习
    TCP/IP协议栈(三)——linux 向下的报文处理
    TCP协议(二)——TIME_WAIT状态
    Linux文件系统inode、block解释权限(三)
    Linux 基本权限(一)
  • 原文地址:https://www.cnblogs.com/kingeric/p/766708.html
Copyright © 2011-2022 走看看