• 沒有找到結果。

第五章 設計與實作

第二節 系統協定

Certi:使用者i的憑證,若為s表示為註冊伺服器。

Ei:利用使用者i的公開金鑰來加密。

Sigi:利用使用者i的私密金鑰來做簽章。

IDi:使用者i的ID。

PWi:使用者i的密碼。

(1) (2) (3) (4)

Register

EA(Register_ACK ||”Register OK”||Time||Sigs(”Register OK”||Time)) Es(IDA||H(PWA)||CertA||Time||SigA(IDA||H(PWA)||CertA||Time))

Certs

User Register Server

圖表 8 註冊新帳號

z 使用者向註冊伺服器註冊一個新帳號 A

當使用者想要向伺服器註冊一個新帳號 A 的步驟如圖表 8:

(1). 使用者在一台安裝有客戶端軟體的機器上與註冊伺服器建立連線,提出 註冊帳號的要求,傳送 Register。

(2). 當註冊伺服器收到使用者送來的要求,會將他的憑證傳送給使用者。

(3). 使用者得到憑證後,即可利用憑證中的公開金鑰加密訊息,將使用者的 ID、密碼相關資訊、憑證、時間戳記、對前四項訊息所做的簽章,用伺 機器的公開金鑰加密起來,傳送給伺服器。

(4). 這時註冊伺服器會回傳的訊息有兩種 z Register_ACK || ”Register OK”

z Register_ACK || ”Account already exist”

當註冊伺服器解密後得到使用者的憑證,會先利用憑證來驗證簽章的正確 性,再檢查時間戳記是否過期。若正確的話就回傳第一種回傳訊息,並儲存 使用者的IDA、密碼相關資訊H(PWA)及使用者的憑證,反之則回傳第二種回 傳訊息。

public class UserInfo implements Serializable{

public String name; // 記錄使用者的 ID

public String ip; // 記錄使用者目前的 IP Address public int port; // 記錄使用者的 Port

}

圖表 9 記錄使用者資料的資料結構 z 登入使用本系統

一、輸入你的帳號,傳送

Es(SignIn||IDAlice||H(PWAlice)||Time||SigAlice(IDAlice||H(PWAlice)||Time)) 的 訊 息給註冊伺服器

二、伺服器解密後檢查簽章的正確性,時間戳記有否過期,比對密碼相關資 訊,若都正確表示登入成功,註冊伺服器會將使用者的 ID、與目前 IP Address 及 Port 記錄在我們設計的資料結構中(如圖表 9)

三、註冊伺服器會根據帳號來尋找好友名單,並且與目前連上線的使用者做 比對,最後將比對後的結果加密傳回

EAlice (SignIn_ACK_OK||OnlineFriendListAlice||OfflineFriendListAlice||Time ||

Sigs(OnlineFriendListAlice||OfflineFriendListAlice||Time))

四、當使用者解密得到資料時,對簽章驗證及時間戳記無誤後,依據 OnlineFriendListAlice的裡的IP Address資訊,傳送上線通知給你的線上好 友

z 建立安全通道

Register Server

圖表 10 建立安全通道

(1). Alice向註冊伺服器要求Bob的憑證,傳送

Es(Cert_Req || IDAlice|| IDBob || Time || SigAlice(IDAlice||IDBob || Time)),註冊伺 服器確認簽章及時戳沒問題後,傳會Bob的憑證

(2). 註冊伺服器會將Bob的憑證傳送給Alice

EAlice(Cert_ACK || CertBob || Time || Sigs(CertBob || Time)),Alice檢查簽章及 Alice

(1) (2)

(3)

(4) Bob

(5)

時戳沒問題後,準備與Bob建立安全通道

(3). Alice傳送溝通的要求給Bob的同時,也會將自己的憑證傳送過去 EBob(Com_Req||IDAlice||CertAlice ||Time||SigAlice(IDAlice||CertAlice||Time)) (4). Bob檢查簽章及時戳沒問題後,回傳Com_ACK

EAlice(Com_ACK||“Hello”||Time||SigBob(“Hello”||Time))

(5). Alice收到Com_ACK後,表示雙方之間的連線已建立。接下來雙方要溝 通兩把初始金鑰,由Alice產生初始金鑰Kenc,Kauth,將初始金鑰加密後傳 給Bob,EBob(Key_Init||Kenc||Kauth||Time||SigAlice(Kenc||Kauth||Time))。Bob解密 得到內容後,確認憑證與時戳沒問題後。就可以利用初始金鑰,並聽取 廣播伺服器所發送的隨機字串,計算出用來加密與用在訊息驗證的 one-time pad Xenc跟Xauth,然後利用不可捏造的加密方法來做加解密的動 作。

public class RandomData {

public BigInteger random_bits_bignum = null; // 記錄隨機字串 public BigInteger index_bignum = null; // 記錄隨機字串的索引 }

圖表 11 隨機位元的資料結構

聽取隨機字串的方法. 因 為 我 們 模 擬 的 廣 播 方 式 是 利 用 多 點 傳 播 (Multicast),在乙太網路架構中不論是廣播還是多點傳播都是用 UDP(User Datagram Protocol)類型的封包來傳送訊息的。而 UDP 的傳送協定是一個不 可靠的傳送協定,因此會有封包遺失的情況發生,所以 Alice 與 Bob 所聽取 到的隨機字串,會因為某些封包的遺漏而造成收到不同的隨機字串。因此我 們設計特殊的資料結構,來使我們方便解決雙方收到不同的隨機字串。

隨機字串的資料結構如圖表 11,每段隨機字串後面都伴隨著一個唯一 的索引,因此由傳送訊息者去聽取目前隨機字串後面伴隨的索引值,並將其

加上 500 傳送給對方。這是因為我們在傳送索引時,也會花費時間的關係,

所以為了使雙方都能從相同的索引值開始接收,因此約略的加上 500。接著 雙方由得到的索引值開始接收隨機字串,當接收到一個段落時就先將索引值 傳給對方,接收方經過比對後將結果回傳,雙方留下交集部份的隨機字串,

反覆的做相同的動作直到隨機字串的數量足夠為止。詳細步驟如圖表 12:

圖表 12 聽取隨機字串的協定

(1). Alice 聽取目前隨機字串所伴隨的索引 index_i。

(2). 將 index_i 加上 500 後,start_index = index_i + 500,傳送 start_index 給 Bob。

(3). Bob 收到後回傳 ACK,start_index_ack。

(4). Alice 與 Bob 雙方根據 start_index 去接收隨機字串,將那些索引比 start_index 大的隨機字串儲存。

(5). Alice 將 儲 存 的 隨 機 字 串 所 伴 隨 的 索 引 傳 串 聯 起 來 , 傳 送 給 Bob , Index1||Index2||Index3…….||Index20484

4 在此我們以接收 2048 筆隨機字串為一個單位

Alice

Broadcast Server

Bob

(4) (4)

(1)

(2) (3) (5) (6)

(6). Bob 收到後,與自己所儲存的隨機字串索引做比對,將經過交集的結果 以 True 或 False 表示法,回傳給 Alice。

Ex. True||False||True…….||True z 登出本系統

一、傳送Es(SignOut||IDAlice||Time||SigAlice(IDAlice||Time))的訊息給註冊伺服器。

二、註冊伺服器檢查簽章與時間戳記無誤後,將Alice從所有線上使用者的 名單中刪除,並回傳

EAlice (SignOut_ACK ||“SignOut OK”||Time|| Sigs(“SignOut OK”||Time))。

三、Alice 檢查簽章與時間戳記無誤後,會依據 Online Friend List 裡的 IP Address 資訊,傳送離線通知給線上好友。

z 新增/刪除好友

一、輸入好友的帳號,傳送

Es(AddFriendList||IDAlice||IDfriend||Time||SigAlice(IDAlice||IDfriend||Time)) 給 註 冊伺服器。

二、註冊伺服器收到後檢查簽章與時間戳記無誤後,再檢查IDfriend是否為已 註 冊 過 的 使 用 者 。 若 是 一 個 尚 未 註 冊 的 帳 號 , 註 冊 伺 機 器 回 傳

EAlice(AddFriendList_ACK||“not register”||Time||Sigs(“not register”||Time)) 若是一個註冊過的帳號,檢查這個帳號是否在所有線上使用者的名單

中,伺服器回傳

,接著註冊伺機器將好友帳號寫進Alice好友名單中。

EAlice(AddFriendList_ACK||True|| UserInfofriend ||Time||

Sigs(True|| UserInfofriend ||Time)) 若為上線 EAlice(AddFriendList_ACK||False||Time||

Sigs(False||Time)) 若為離線

三、客戶端根據收到的傳回值來更新上線與離線的好友名單。

四、刪除好友的步驟與新增好友的一樣,只是將 Add 更改為 Delete。在此就

不詳細描述。

相關文件