(亿众国际-009)[原创]这是一个非常有趣的例子!
/////////////////////////////////////////////////////////////
//author: stardicky //
//e-mail: stardicky@hotmail.com //
//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));
}
}
}