這是一個非常有趣的例子!(DotNET密碼系統(tǒng))
2024-07-21 02:30:04
供稿:網(wǎng)友
(億眾國際-009)[原創(chuàng)]這是一個非常有趣的例子!
/////////////////////////////////////////////////////////////
//author: stardicky //
//e-mail: [email protected] //
//qqnumber: 9531511 //
//company: ezone international //
//class: hbs-0308 //
//title: 利用密碼系統(tǒng)保證數(shù)據(jù)安全 //
/////////////////////////////////////////////////////////////
//介紹: //
// 這是一個非常有趣的例子! //
// 在ezone international公司里ting是dicky的女友,viisen是//
//他們的上級.viisen不允許公司內(nèi)部員工談戀愛,上有政策,下有對//
//策,ting和dicky利用空閑時間通過郵件的方式與對方通訊,viisen//
//下發(fā)任務(wù)給dicky的方式也是通過發(fā)送郵件.為了保存郵件的安全 //
//性,郵件采用rc2(對稱加密)加密方式進行發(fā)送,rc2的密鑰經(jīng)過rsa//
//(非對稱加密)的加密.ting,dicky和viisen各自有一對公鑰和密鑰//
//.ting和dicky的通訊內(nèi)容對于viisen是不可見的,dicky和viisen //
//的通訊內(nèi)容對于ting是不可見的. //
/////////////////////////////////////////////////////////////
using system;
using system.io;
using system.text;
using system.security.cryptography;
namespace ezonesecuritysystem
{
class ezonesecuritydemo
{
//創(chuàng)建三個員工對象,分別是 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給自己發(fā)送郵件消息 ====================");
scene_1();
console.writeline("=========================================================================");
console.write("按任意鍵繼續(xù)......");
console.in.readline();
console.writeline("==================== 場景二: dicky給ting發(fā)送郵件消息 ====================");
scene_2();
console.writeline("=========================================================================");
console.write("按任意鍵繼續(xù)......");
console.in.readline();
console.writeline("================ 場景三: dicky給ting ,viisen發(fā)送郵件消息 ================");
scene_3();
console.writeline("=========================================================================");
console.write("按任意鍵繼續(xù)......");
console.in.readline();
}
/// <summary>
/// dicky給自己發(fā)送郵件消息
/// </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發(fā)送郵件消息
/// </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發(fā)送郵件消息
/// </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年度的財務(wù)總結(jié)報告放在你的辦公桌上!");
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;//郵件內(nèi)容(內(nèi)容通過rc2(對稱加密)加密過的)
public byte[] rc2key; //rc2的密鑰(通過rsa(非對稱加密)加密過的)
public byte[] rc2iv; //rc2的初始化向量
}
//員工對象
class ezoneperson
{
//rsa(非對稱加密對象)
private rsacryptoserviceprovider ezonersa;
//rc2(對稱機密對象)
private rc2cryptoserviceprovider ezonerc2;
//員工姓名
private string name;
//person構(gòu)造方法
public ezoneperson(string name)
{
//初始化成員對象
this.ezonersa=new rsacryptoserviceprovider();
this.ezonerc2=new rc2cryptoserviceprovider();
this.name=name;
}
//發(fā)送公鑰
public rsaparameters sendpublickey()
{
//rsa的公鑰和密鑰對象
rsaparameters result=new rsaparameters();
//導(dǎo)出ezonersa的公鑰(false 表示不導(dǎo)出私鑰)
result=this.ezonersa.exportparameters(false);
return result;
}
//獲得公鑰
public void getpublickey(ezoneperson obj)
{
//導(dǎo)入 ezoneperson對象 的公鑰
this.ezonersa.importparameters(obj.sendpublickey());
}
//加密郵件
public ezonemessage encryptmessage(string text)
{
ezonemessage messageobj=new ezonemessage();
//將消息從字符串的形式轉(zhuǎn)換成字節(jié)數(shù)組的形式
byte[] messagebytes=system.text.encoding.utf8.getbytes(text);
//隨機創(chuàng)建rc2的密鑰
this.ezonerc2.generatekey();
//隨機創(chuàng)建rc2的初始化向量
this.ezonerc2.generateiv();
//用rsa加密rc2的密鑰,并賦值給消息對象的rc2的密鑰匙(false 表示不用oaep進行填充,只有winxp以上版本的*作系統(tǒng)才支持)
messageobj.rc2key=this.ezonersa.encrypt(this.ezonerc2.key,false);
//給消息對象的rc2的向量賦值
messageobj.rc2iv=this.ezonerc2.iv;
//創(chuàng)建一個加密對象
icryptotransform myencryptor=this.ezonerc2.createencryptor();
//創(chuàng)建一個內(nèi)存流
memorystream ezonememorystream=new memorystream();
//在內(nèi)存流的基礎(chǔ)上創(chuàng)建一個加密流對象
cryptostream myencryptostream=new cryptostream(ezonememorystream,myencryptor,cryptostreammode.write);
//向加密流中寫入郵件內(nèi)容
myencryptostream.write(messagebytes,0,messagebytes.length);
//刷新加密流的緩沖區(qū)
myencryptostream.flushfinalblock();
//給消息對象的messagebody(消息主體)賦值(經(jīng)過rc2加密過的字節(jié)數(shù)組)
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以上版本的*作系統(tǒng)才支持)
this.ezonerc2.key=this.ezonersa.decrypt(obj.rc2key,false);
}
catch(cryptographicexception e)
{
console.writeline("解密失敗: "+e.message);
return;
}
//創(chuàng)建一個解密對象
icryptotransform mydecryptor=this.ezonerc2.createdecryptor();
//創(chuàng)建一個內(nèi)存流,用obj的郵件消息初始化內(nèi)存流!
memorystream ezonememorystream=new memorystream(obj.messagebody);
//在內(nèi)存流的基礎(chǔ)上創(chuàng)建一個解密流對象
cryptostream mydecryptostream=new cryptostream(ezonememorystream,mydecryptor,cryptostreammode.read);
//存儲解密后的郵件內(nèi)容
byte[] messagetext=new byte[obj.messagebody.length];
//從解密流解密數(shù)據(jù),并把解密過的數(shù)據(jù)寫入到messagetext字節(jié)數(shù)組中
mydecryptostream.read(messagetext,0,messagetext.length);
ezonememorystream.close();
mydecryptostream.close();
console.writeline("解密成功:"+system.text.encoding.utf8.getstring(messagetext));
}
}
}