欢迎光临
我们一直在努力

这是一个非常有趣的例子!(DotNET密码系统)-.NET教程,安全和优化

建站超值云服务器,限时71元/月

(亿众国际-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));

}

}

}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 这是一个非常有趣的例子!(DotNET密码系统)-.NET教程,安全和优化
分享到: 更多 (0)