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