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 如下:

 

  1. Client 想要建立連線,就傳給 Server 他的名字,及一個 random number,稱為 Nonce1。
  2. Server 接到後就 Random產生一個 Session Key,再加上一個 Random number,稱為 Nonce2,並也把 Nonce1 一起傳回去。當然這不是隨隨便便的傳回去,而是把這些東西一起用 Client 的 Public Key 加密後,再傳給 Client。
  3. Client 收到後便可用自己的 Private Key 把這個 Message 解開。解開後,比較看看 Server 所傳回了的 Nonce1 和第一步驟時自己所產生的 Nonce1是否相等,若是不等,顯然是這個連線無法再建立下去!若是相等,Client 就可以幾乎保證他拿到了一個 Server 給他的 Session Key,從此以後的資料,都用這個 Session 加密。得到 Session Key 後,Client 再用此 Session Key 把 Nonce2 加密傳回給 Server。
  4. Server 收到 Nonce2 後,比較一下和步驟二中所產生的 Nonce2是否相同。若是不同,表示 Client 並沒有得到 Session Key,當然也就不用連線了。若是相同,幾乎可以確定對方一定就是那個 Client,於是 Server 就透過 Session Key 把在目前線上的使用者資訊傳給 Client。於是連線建立成功。

當連線建立成功後,我們所要處理的訊息便只有以下三種:

  1. 當有新的使用者加入時,要更新目前線上使用者的『使用者資訊』。這個部份包含了圖檔﹍等較複雜的資料。
  2. 一般的聊天。這是純文字就可以處理的。
  3. 對某些話簽字以表慎重。當然能簽字就一定也要能驗證簽字是否正確。

這些不同的訊息會對應到不同的資料結構,要如何知道某一訊息是什麼樣的訊息呢?於是便在訊息前加一個 Header。Header包含兩個重要的資料:

  1. 序號 (sequence number):用序號來解決連線建立時的同步問題。
  2. 選擇(option):用來分辨 Message 中是什麼樣的資訊,有『使用者資訊』、『文字資訊』、『簽字』三種。