Term Project:
Secure Archive and Implementation of Secure Chat room
R87526023
陳必衷任何資料在處理或計算過後,都需要把他們記錄下來,或是傳送給別人。在 MFC 中,用 CArchive 類別及 Serialize 函數使物件可以很方便的被儲存,或透過網路傳送給別人。更好的是它還可以動態生成。但如果我們不希望這些資料被別人看到,勢必要將其『加密』了。於是我想到了一個 Secure Archive 的概念,可以讓所有 Serializable 的物件都有『加密』的功能,而且不用對這些物件加什麼『虛擬涵數』之類的。我也寫了一個程式,讓 MFC sample program 中的 chatter 變成一個『安全』聊天室。當然不只可以傳文字的資料,影像的資料或是任何 Serilizable 的物件都可以『安全的』透過網路傳輸。
Secure Archive
我把它寫成
CSecArchive 類別。其中最主要的精神就是運用現成 MFC的 Serialize 涵式,把它包裝一下,就變成了一個『保密』的 Archive 的。方法大致如下圖:
簡單的來說就是經由
MFC 的 Serialize 函數,把要儲存的資料存到一個暫存檔中,再對暫存檔加密,最後輸出到『想要儲存的檔案或 Socket』。如此所有 MFC Serialization的好處都可以不用多加什麼程式碼直接得到。而對於寫程式的人而言,因為暫存檔是被CSecArchive類別所包裝起來,所以使用上就跟使用 CArchive 一樣方便,但是卻達到了保密的功能。在我的 chat room 的程式中,就利用這種方法,把任何想要透過網路傳送的物件,很輕易的就『保密』的傳送過去了,例如:圖檔﹍﹍等。怎麼說是使用容易呢?
我模仿
MFC 的作法,若果某類別 Class1 希望能有 Secure Serialization。只要在類別定義時加上:DECLARE_SECSERIAL例如:
class Class1 : public Cobject{
﹍
DECLARE_SECSERIAL
﹍
}
並且在其
.cpp 檔中加上:IMPLEMENT_SECSERIAL(className)之後就可以把以前我們所宣告的
CArchive 物件全部改成 CSecArchive 的物件,把 Obj1.Serialize(ar); 這樣的敘述改成 Obj1.SecSerialize(ar, key) 即可。如此不必花太大了力氣,就擁有了安全的資料儲存及傳輸功能。當然,透過暫存檔,在執行上會比較花時間,也較耗資源,但若是用在不是非常
time critical 的應用上,其實也是蠻夠用的!畢竟『Developing time』和『Running time』是不能兩全其美的。在
CSecArchive 中我所用的『加密方法』是傳統『對稱式』的加密法。可以用 RC6、RC5、或是 DES,當然也是可以自己寫,只要把它寫成 CcipherBase 的物件就可以直接套用了!Implementation of Chat Room
Chat Room 是一個
Public Key 的 System。可以傳送文字,圖片,也可對文字加以簽字,當然也要能驗證簽字。保密的方法是在每次連線時 Server 傳給 Client 一個 Random 的 Session Key,而這個 Session Key 是用 Client 的 Public Key 加密過的,所以只有這個 Client 才可以解密,之後才能取得 Session Key 做進一步的溝通。當連線確定之後,就不再用 RSA 加密或解密,而採用傳統『對稱式』加密法,在此程式中是用 RC6。在這個 chat room 中不止傳送大家聊天的訊息,也會把在線上的使用者資訊告訴每一個 Client,包含了使用者的名字、Public Key,以及他的照片﹍。其 Protocol 如下:
當連線建立成功後,我們所要處理的訊息便只有以下三種:
這些不同的訊息會對應到不同的資料結構,要如何知道某一訊息是什麼樣的訊息呢?於是便在訊息前加一個
Header。Header包含兩個重要的資料: