[優(yōu)秀畢業(yè)論文]安全聊天系統(tǒng)的設(shè)計與實現(xiàn)
《[優(yōu)秀畢業(yè)論文]安全聊天系統(tǒng)的設(shè)計與實現(xiàn)》由會員分享,可在線閱讀,更多相關(guān)《[優(yōu)秀畢業(yè)論文]安全聊天系統(tǒng)的設(shè)計與實現(xiàn)(31頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 《安全聊天系統(tǒng)的設(shè)計與實現(xiàn)》 第31頁 共32頁 安全聊天系統(tǒng)的設(shè)計與實現(xiàn) 學(xué)生姓名:xxx 指導(dǎo)老師:xxx 摘 要 隨著計算機的不斷普及和互聯(lián)網(wǎng)技術(shù)在全球領(lǐng)域的高速發(fā)展。越來越多的人使用到了聊天程序。聊天程序給人們帶來通信便利的同時也存在著一些安全隱患,傳統(tǒng)的聊天程序以明文方式傳送聊天內(nèi)容,這樣就給一些用心不良的人大開方便之門。本系統(tǒng)正是基于以上原因而設(shè)計的加密聊天程序。聊天程序采用服務(wù)器/客戶端模式。在Linux環(huán)境下采用socket套接口編程,服務(wù)器程序以創(chuàng)建線程池的方式為每一個客戶服務(wù)。聊天內(nèi)容由服務(wù)器轉(zhuǎn)發(fā)。在聊天程序中加入了對稱加密
2、算法DES和非對稱加密算法RSA。其基本實現(xiàn)是由服務(wù)器端生成RSA的公鑰和私鑰,由客戶端生成DES對稱密鑰,服務(wù)器端傳送公鑰至客戶端加密DES密鑰之后回傳服務(wù)器,服務(wù)器再用本地的私鑰解密獲得DES密鑰。此后雙方的通信由DES密鑰加密后傳送,這樣既能高效的加密明文又能在信道上安全的傳送密鑰使得密鑰間的共享成為現(xiàn)實。 關(guān)鍵詞 對稱加密算法;非對稱加密算法;聊天系統(tǒng) The Design and implementation of safe chat system Abstract Along with Computer becoming more and more popular and
3、 Internet technology developing rapidly, a lot of People began to use the IM(chat program). Chat program brings people more convenience, but at the same time, security problem existed. The traditional chat program sends the message by plain text, which open the door for the bad man. This encrypted c
4、hat system is right based on the point. The system is in C/S architecture using socket based on Linux. The server program serves each client in the way of establishing thread and is responsible to transfer message. The DES algorithm and RSA algorithm are used to encrypt in this program. The basic pr
5、inciple is that the server generates RSA public key and private key and client generates DES symmetrical secret key. Firstly, the server sends the public key to client, and then client sends it back after encrypting DES secret key. Secondly, the Server uses local private key to decode to obtain the
6、DES private key. After then, the message is sent after encrypted by DES secret key. So the plain text can be encrypted effectively and sent in channel in security. Key words symmetry encrypting program; unsymmetrical encrypting program;chat system 1 引言 1.1 課題背景 自從TCP/IP協(xié)議族成為計算機通信的主要網(wǎng)絡(luò)協(xié)議,基于該
7、協(xié)議族開發(fā)的網(wǎng)絡(luò)應(yīng)用程序數(shù)不勝數(shù)。聊天程序便是其中之一。聊天程序使人們可以通過互聯(lián)網(wǎng)及時傳送消息,讓遠(yuǎn)在千里之外的人們暢所欲言。傳統(tǒng)的聊天程序在給人們帶來方便的同時也逐漸暴露出一些安全隱患。前不久網(wǎng)上登出了這樣一則新聞:上海某銀行的白領(lǐng)麗人,因為聊天程序受監(jiān)控被同事知道了個人隱私,被迫辭去了月薪三萬余元的工作。于是聊天程序的安全性受到了人們的廣泛關(guān)注。 1.2 國內(nèi)外研究現(xiàn)狀 從國內(nèi)外對聊天程序的加密情況看,大多數(shù)處理方式是在現(xiàn)有的聊天程序基礎(chǔ)之上添加相應(yīng)的加密插件來實現(xiàn)加密。比較典型的例子是Linux平臺下的多集成聊天程序Gaim,其中集成了ICQ、MSN、QQ等現(xiàn)今主流國內(nèi)外聊天程序
8、。普遍的聊天程序沒有經(jīng)過加密而直接傳輸聊天明文。Gaim通過添加插件程序?qū)ξ醇用艿牧奶斐绦蜻M行加密傳輸,通信雙方需要只要同時安裝加密插件就可以順利的對聊天內(nèi)容進行加密解密。這其中存在一個現(xiàn)而易見的問題:要是一方加入了加密插件而另一方卻沒有相應(yīng)的解密程序顯然雙方不能正確通信。 1.3 本課題研究的意義 聊天程序是否加密關(guān)系著用戶的切身利用。為了保衛(wèi)公民隱私權(quán)不受到網(wǎng)絡(luò)黑客的不法侵犯,開發(fā)加密傳輸信息的聊天程序有著重大意義。聊天程序的加密特性對用戶應(yīng)該是透明的。正如前面分析,如果以安裝插件的方式加密聊天程序很可能造成通信雙方加密不一致的情況。因此將加密算法內(nèi)嵌入聊天程序可以保證通信雙方均能正
9、常通信。 傳統(tǒng)的對稱加密算法如DES雖然可以快速的加密和解密明文,然而其密鑰難以分配和管理。如果讓通信雙方相互約定密鑰顯然是不合適的,因此最好的方式是由一方產(chǎn)生密鑰然后傳送給另一方?;诠€的非對稱加密體制的引入正是用于解決對稱加密算法在密鑰管理上的不足,但是非對稱加密算法如RSA存在運算強度過大、費時較長等問題。如果直接用于加密聊天程序,其生成密鑰和加密解密所需時間是人們在通信過程中所不能容忍的,采取將兩種加密算法相結(jié)合的方式可以很好的解決以上問題,從而達到安全快速的加密數(shù)據(jù)。 2所采用技術(shù)的先進性分析 2.1 DES算法 DES是Data Encryption Standard
10、(數(shù)據(jù)加密標(biāo)準(zhǔn))的縮寫。它是由IBM公司研制的一種加密算法,美國國家標(biāo)準(zhǔn)局于1977年公布把它作為非機要部門使用的數(shù)據(jù)加密標(biāo)準(zhǔn),二十年來,它一直活躍在國際保密通信的舞臺上,扮演了十分重要的角色。 DES是一個分組加密算法,它以64位為分組對數(shù)據(jù)加密。同時DES也是一個對稱算法:加密和解密用的是同一個算法。它的密鑰長度是56位(因為每個第8位都用作奇偶校驗),密鑰也可以是任意的56位數(shù),而且可以任意時候改變。其中有極少量的數(shù)被認(rèn)為是弱密鑰,但是很容易避開它們。所以保密性依賴于密鑰。 2.2 RSA算法 1978年,美國麻省理工學(xué)院(MIT)的研究小組成員Ronald L Rivest、Ad
11、i Shamir、 Leonard Adleman提出了一種基于公開密鑰密碼體制的優(yōu)秀加密算法--RSA算法。RSA的取名就是來自這三位發(fā)明者姓氏的第一個字母。該算法以其較高的保密強度逐漸成為一種廣為接受的公鑰密碼體制算法。RSA算法是一種分組密碼體制算法,它的保密強度是建立在具有大素數(shù)因子的合數(shù),其因子分解NP(Nondeterministic Polynomial)完全問題這一數(shù)學(xué)難題的基礎(chǔ)上的,因此RSA算法具有很強的保密性。 RSA算法研制的最初目標(biāo)是解決DES算法秘密密鑰利用公開信道傳輸分發(fā)困難的難題,而實際結(jié)果不但很好地解決了這個難題;還可利用RSA來完成對消息的數(shù)字簽名以防對消
12、息的抵賴;同時還可以利用數(shù)字簽名發(fā)現(xiàn)攻擊者對消息的非法篡改,以保護數(shù)據(jù)信息的完整性。 RSA算法是第一個能同時用于加密和數(shù)字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。RSA得到了世界上的最廣泛的應(yīng)用,并于1992年ISO國際標(biāo)準(zhǔn)化組織在其頒發(fā)的國際標(biāo)準(zhǔn)X.509中,將RSA算法正式納入國際標(biāo)準(zhǔn)。 2.3 線程池 在傳統(tǒng)的UNIX模型中,當(dāng)一個進程需要另一個實體來完成某事時,它就fork一個子進程并讓子進程去執(zhí)行處理。Unix上的大多數(shù)網(wǎng)絡(luò)服務(wù)器程序就是這么編寫的,父進程accept一個連接,fork一個子進程,該子進程處理與該連接
13、對端的客戶之間的通信。 盡管這種范式多少年來一直良好地服務(wù)著,fork調(diào)用卻存在一些問題:1 fork是昂貴的。fork要把父進程的內(nèi)存映象拷貝到子進程,并在子進程中復(fù)制所有描述字,如此等等。2 fork返回之后父進程之間信息的傳遞需要進程間通信(IPC)機制。調(diào)用fork之前父進程向尚存在的子進程傳遞信息相當(dāng)容易。因為子進程將從父進程數(shù)據(jù)空間及所有描述字的一個拷貝開始運行。然而從子進程往父進程返回信息卻比較費力。 線程有助于解決這兩個問題。線程有時稱為輕權(quán)進程(lightweight process),因為線程比進程“權(quán)重輕些”。也就是說,線程的創(chuàng)建可能比進程的創(chuàng)建快10~100倍。
14、 線程池是指在服務(wù)器啟動階段預(yù)先創(chuàng)建一系列線程阻塞于accept調(diào)用,每個客戶由當(dāng)前可用線程池中的某個(閑置)線程處理。這種處理方式比通常的客戶連接到來時臨時創(chuàng)建線程為其服務(wù)要快得多。可以獲得很好的性能加速。 3系統(tǒng)需求分析 3.1聊天程序功能分析 1 注冊功能 通常聊天程序需要用戶名和密碼才能使用,所以需要實現(xiàn)web注冊功能,這樣用戶可以很方便的通過web網(wǎng)站注冊自己的用戶名并取得密碼,還可以在服務(wù)器上存儲個人相關(guān)信息以便他人查看。 2 登陸功能 用戶在聊天之前需要輸入用戶名和
15、密碼進行登陸以便獲取自身相關(guān)信息和好友相關(guān)信息,故登陸過程中服務(wù)器需對用戶名和密碼進行必要的核對。 3 聊天功能 這是聊天程序的主要功能。用戶之間的相互通信必須及時快速的由服務(wù)器轉(zhuǎn)發(fā)。 3.2 加密算法 由于是加密聊天程序,故對聊天明文的加密算法應(yīng)選取加密速度相對較快的對稱加密算法(如:DES),又由于DES的加密密鑰是不能公開的秘密密鑰,故對DES的密鑰應(yīng)加密傳送,所以應(yīng)采用非對稱的公鑰加密算法(如RSA)用以分發(fā)DES密鑰。 DES加密算法: 作為對稱加密算法中的DES加密算法由于其加密過程是固定不變的,故應(yīng)考慮其密鑰的生成。由于弱密鑰存在的可能性,還應(yīng)該考慮如何避免生成弱密鑰
16、。因為差分分析法的提出可以快速的破解少于16輪迭代的DES算法,故應(yīng)保證其迭代次數(shù)至少為16輪。 RSA加密算法: 由于RSA是基于大素數(shù)因子分解這一數(shù)學(xué)難題提出的,故RSA中公鑰和私鑰的產(chǎn)生應(yīng)重點考慮。又由于RSA的運算強度較大,故還應(yīng)考慮如何加速其運算速度。 4 系統(tǒng)總體設(shè)計和模塊劃分 4.1 系統(tǒng)總體設(shè)計 圖4.1系統(tǒng)設(shè)計 如圖4.1所示,本系統(tǒng)采用C/S模式。 1 用戶通過web應(yīng)用程序注冊帳號,然后用注冊的帳號登陸聊天程序服務(wù)器。 2 客戶端產(chǎn)生生成DES密鑰,服務(wù)器端在啟動時初始化產(chǎn)生RSA公鑰和私鑰。當(dāng)客戶端向服務(wù)器發(fā)起連接時,服務(wù)器送
17、出RSA公鑰,客戶端用取得的公鑰加密產(chǎn)生的DES私鑰回傳服務(wù)器。 3 最后服務(wù)器與客戶端雙方的通信均由DES加密算法加密通信明文。 4.2 模塊劃分 4.2.1 DES算法模塊 1 加密算法3個主要步驟 第一步,初始置換IP 圖4.2 初始置換表IP 圖4.2為初始置換表IP,64bit輸入明文經(jīng)過該表完成初始置換。 第二步,16輪迭代 圖4.3 16輪迭代 圖4.3為DES16輪迭代,將經(jīng)過初始置換的數(shù)據(jù)分成Li和Ri兩部分。將Ri直接交換為Li+1,Li與Ri經(jīng)過f函數(shù)處理后的數(shù)據(jù)相異或得Ri+1,最后一輪不做交換。 第三步,逆置換 圖4.4 逆
18、置換表(IP-1) 圖4.4為逆置換表(IP-1),經(jīng)過16輪迭代后通過該表置換得到輸出的密文。 2 子密鑰的產(chǎn)生 圖4.5 生成子密鑰 圖4.5為子密鑰生成過程,將64bit初始密鑰經(jīng)過PC-1表置換為56bit輸入,分為Ci, Di兩組分別進行LS循環(huán)左移,再經(jīng)過PC-2表壓縮為48bit子密鑰。如此循環(huán)16輪生成16組子密鑰。 4.2.2 RSA算法模塊 1 大數(shù)的運算 加法運算: 設(shè)定相應(yīng)的進位變量c,按位相加,如ri = ai + bi + c,當(dāng)ai + bi + c > m (m為權(quán)值),c送1,ri = (ai + bi + c) mod m, 否則c送
19、0。 減法運算: 設(shè)定相應(yīng)的借位變量c,按位相減,如ri = ai – bi + c,當(dāng)ai < bi時,c送m (m為權(quán)值),還要將ai高一位減1,如過高位連續(xù)為0則依次置m – 1,一直到第一個非0位并將其減1,否則c送0。 乘法運算: 設(shè)定相應(yīng)的進位變量c,和一個取當(dāng)前結(jié)果位值變量d,雙重循環(huán)。外層循環(huán)依次取運算數(shù)A的相應(yīng)位,內(nèi)層循環(huán)依次取B的相應(yīng)位。r(i + j) = d + ai * bj + c,當(dāng)d + ai * bi + c > m (m位權(quán)值),c送ri/m (m為權(quán)值),d為從對應(yīng)的內(nèi)外循環(huán)位之和(i + j)對應(yīng)的結(jié)果位上取得的值。r(i + j)暫時存入對應(yīng)的
20、結(jié)果位。 除法運算: 假設(shè)A為被除數(shù),B為除數(shù)。當(dāng)A > B,將B擴大到A相同位數(shù),循環(huán)做A = A – Bk (擴充后的B),商位qi = qi + 1,最后A為余數(shù)。 取余運算: 依除法運算輸出余數(shù)A。 乘方運算: 與乘法運算一樣設(shè)有進位變量c和取當(dāng)前結(jié)果位值變量d。依然分內(nèi)外兩層循環(huán)。外層循環(huán)中d = r (2 * i),r(2 * i) = d + ai * ai,在此僅計算相同位ai的乘積存入結(jié)果位r(2 * i)中。內(nèi)層循環(huán)d = r (i + j),r(i + j) = d + 2 * ai * aj + c,這里由于乘數(shù)A和被乘數(shù)B相等,故可以采用2 * ai *
21、aj,這種方式提前運算對應(yīng)位??梢钥闯鲞@種預(yù)處理方式加快了運算速度。 模冪運算: 將模冪運算轉(zhuǎn)化為乘模運算。定理:(a * b) mod n = ((a mod n) * (b mod n)) mod n。計算A^m mod n:令c = 1,如果m = m % 2 == 0 循環(huán)計算 A = (A * A) mod n 否則 m = m – 1,c = (A * c) mod n。最后輸出c。 2 選取P,Q 先以生成隨機數(shù)的方式生成隨機奇數(shù)A、B。再讓A、B依次通過Miller-Rabin素性測試。 Miller-Rabin素性測試:先計算出m、j,使得n-1=m*2^j,其中
22、m是正奇數(shù),j是非負(fù)整數(shù),隨機取一個b,2<=b,計算v=b^m mod n,如果v==1,通過測試,返回。令i=1,循環(huán)以后步驟,如果v=n-1,通過測試,返回。如果i==j,非素數(shù),結(jié)束。v=v^2 mod n,i=i+1。 3 歐幾里德算法求a,b最大公因數(shù)和逆元 定理:gcd (a, b) = gcd (b, a mod b) (設(shè)a > b) r = a mod b, a = b,b = r 循環(huán)以上三步直到r = 0, 則a為所求最小公因數(shù)。r = a mod b => x * a + y * b = r。 x稱為a的逆元。在每步循環(huán)過程中將前一步中的r代入下一步中合并后可求
23、得逆元x。 4.2.3 DES和RSA安全性討論 1 弱密鑰 所謂的弱密鑰是指在所有可能的密鑰中,有某幾個特別的密鑰,會降低DES的安全性,所以使用者一定要避免使用這幾個弱密鑰。而弱密鑰產(chǎn)生的原因是由于子密鑰產(chǎn)生過程的設(shè)計不當(dāng)所導(dǎo)致的。 由子密鑰產(chǎn)生的過程來看,假設(shè)有某個初始密鑰經(jīng)過密鑰初始置換表置換,使得寄存器C0與D0的內(nèi)容成為全是“0”或全是“1”的數(shù)據(jù)。如此一來,不管以后的每一輪中之循環(huán)左移函數(shù)是如何地變化,Ci與Di的內(nèi)容并不會有所改變的。換句話說,這樣的初始密鑰,將會產(chǎn)生16個一摸一樣的子密鑰。如此一來將大大地降低DES的安全性。 弱密鑰有另外一個特性-對弱密鑰而言,其加
24、密與解密的過程是完全一樣的。我們知道DES的加密與解密過程中,唯一的不同在于子密鑰的使用順序是相反的。然而對弱密鑰而言,因為其所衍生的16個子密鑰是完全相同的,故子密鑰之間也就毫無順序之分了。 2 半弱密鑰 除了上述的弱密鑰之外,還有另外一種稱之為半弱密鑰的初始密鑰。其特性是此類初始密鑰所產(chǎn)生的子密鑰,只有兩種可能。而每一種可能的子密鑰,剛好各出現(xiàn)8次。 假設(shè)現(xiàn)在有兩個位串:A=0101…0101,與B=1010…1010,那么無論如何對A做循環(huán)左移動作,其結(jié)果不是A就是B。當(dāng)然對B做循環(huán)左移動作也會得到一樣的結(jié)果。如果對某個弱密鑰而言,它滿足以下兩個條件,那么它就屬于以上所謂的半弱密鑰
25、了。 (1)子密鑰排列中的C(或D)寄存器只含有0101,…,0101或1010,…,1010這兩種形式的數(shù)據(jù)。 (2)另一個寄存器D(或C)含有0000,…,0000,1111,…,1111,0101,…,0101或1010,…,1010任何一種形式的數(shù)據(jù)。 3 差分分析法 差分分析法基本上是屬于選擇明文攻擊法。但在某些特定的情形下,也可用于已知明文攻擊。這個方法簡單地說,就是分析特殊明文配對(Plaintext Pair)的差值相對應(yīng)的密文配對(Ciphertext Pair)的差值所產(chǎn)生的影響。這里所謂的差值是指兩個明文(或密文)之間做異或(XOR)所得到的值。 這個做法的主要
26、概念在于差值的運算會使得DES變得簡單許多。我們知道DES可看做一部非常復(fù)雜的非線性機器,即使知道某一明文對應(yīng)的密文,若無法得知密鑰,也很難去推導(dǎo)出這一部機內(nèi)部的數(shù)據(jù)流。當(dāng)在差值的概念下,就有機可趁了。 對DES中的某個差值而言,最多的可以有2的64次方個明文(或密文)配對與之對應(yīng)。差分密碼分析法所在乎的是差值本身,而非其所對應(yīng)的明文(或密文)配對。而某些特殊的差分密碼分析法就是選取許多擁有相同特征值的明文配對,加密后得到相對應(yīng)的密文配對,再借著特征值與這些密文配對推導(dǎo)出一些可能的密鑰,并附與可能的概率,最后再選出最有可能者。 B. RSA安全性討論 不可使用公共的模N 在某些情況下,
27、我們假設(shè)有一密鑰產(chǎn)生中心(Key Generation Center, KGC),利用RSA系統(tǒng)產(chǎn)生一公共模N = pq。此中心接著產(chǎn)生許多對的加密與解密密鑰{ei,di},并將解密密鑰di秘密傳送給使用者i,且公布ei為使用者i的公開密鑰。此系統(tǒng)的優(yōu)點為密鑰管理非常簡單,因為系統(tǒng)中使用公共的模(N),不會有Reblocking問題產(chǎn)生,且可節(jié)省公開密鑰的存儲空間。不過,RSA系統(tǒng)使用公共的模,卻可能招致下列三個主要的問題,使得此系統(tǒng)并不安全。 1 若相同的明文m分送給兩個不同的使用者,則此系統(tǒng)可能變得不安全 設(shè)預(yù)將明文m加密后分送給使用者i及j,則其密文分別為Ci = m^ei mod
28、 N及Cj = m^ej mod N。 若使用者i與j的公開密鑰ei與ej互素,則由歐幾里德算法可求得兩整數(shù)r及s使得rei + sej = 1。 很明顯地,r或s一定有一個為負(fù)數(shù),即r = -|r|。若Ci與N互素(若不是的互,則我們可利用最大公因子方法求出p或q,盡而分解N),則Ci的乘法逆元Ci-1存在,并可被輕易求出。由下式我們可以容易求出明文m: (Ci-1)^|r|(Cj)^s = (m^ei)^-|r|(m^ej)^s = m^(rej + sej) = m mod N 因此,若有相同的明文分送給兩個不同的使用者,且此二使用者的公開密鑰為互素,則此系統(tǒng)并不安全。 2 擁
29、有一對的加密/解密密鑰就能因子分解N Delaurentis提出一種概率算法,使得擁有一對加/解密密鑰的人就能因子分解N。其基本概念為找出一整數(shù)b使得 (1) b^2 = 1 mod N (2) b != +- 1 mod N (3) 1 < b < N 由基本數(shù)論知,若N = pq,滿足上述條件的b共有兩個。若能找出任一個,則我們即可將N因子分解。因為b^2 -1 = 0 mod N, 則(b + 1)(b - 1) = 0 mod N, 所以(b + 1)(b -1) = kN = kqp, 其中k為整數(shù)。 由于1 < b < N,所以不等式0 < b – 1 < b + 1
30、< N = qp成立。因此p及q不能同時整除b – 1或b + 1,也即b – 1與N必有一公因子p或q。利用歐幾里德算法,求GCD(b – 1, N),即可求得p或q,因此可以將N因子分解。 3 擁有一對加/解密密鑰 能在不必分解N情況下,求出另一對加解密密鑰。 設(shè)已擁有一對加/解密密鑰e及d,則已給出一加密密鑰e1(GCD(e1, f(N)) = 1),即可在不需因子分解N情況下,求出其解密密鑰d1,滿足e1d1 = 1 mod f(N)。 (1) 利用歐幾里德算法求出e1與ed – 1的最大公因子g。 (2) 求出(ed - 1) / g = f。 (3) 利用歐幾里德算法,
31、求出兩整數(shù)r1及d1,使得r1f + d1e1 = 1。 由于g整除ed – 1,因此f必為整數(shù),且f必為f(N)的整數(shù)倍,這是由于f(N)整除ed – 1,且g與f(N)互素。當(dāng)f求出后,第(3)步中,我們求出d1即滿足d1e1 = 1 mod f(N)。因為f為f(N)的整數(shù)倍。 4.2.4 聊天程序模塊 1、數(shù)據(jù)庫設(shè)計 用戶信息表User_Infor (存儲注冊用戶的信息) CREATE TABLE User_Info ( user_id INTEGER AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR (50) NOT NU
32、LL, user_passwd VARCHAR (10) NOT NULL, user_sex VARCHAR (10), user_age INTEGER, user_address VARCHAR (100), INDEX (user_name) ) ENGINE = InnoDB; #指定存儲引擎 好友關(guān)系表Friend_Index (記錄用戶添加的好友) CREATE TABLE User_Online ( user_id INTEGER PRIMARY KEY, ip_address VARCHAR (100) NOT NULL, conn_s
33、ocket INTEGER NOT NULL, FOREIGN KEY (user_id) REFERENCES User_Info (user_id) ) ENGINE = InnoDB; 在線用戶記錄表User_Online (記錄已登陸的在線用戶和與服務(wù)器建立的套接口) CREATE TABLE User_Online ( user_id INTEGER PRIMARY KEY, conn_socket INTEGER NOT NULL, des_key VARCHAR (30) NOT NULL, FOREIGN KEY (user_id) REFERENC
34、ES User_Info (user_id) ) ENGINE = InnoDB; 消息記錄表Messages (緩存發(fā)給離線用戶的消息) CREATE TABLE Messages ( message_id INTEGER AUTO_INCREMENT PRIMARY KEY, from_id INTEGER NOT NULL, to_id INTEGER NOT NULL, body TEXT NOT NULL, date_posted TIMESTAMP NOT NULL, INDEX (to_id), FOREIGN KEY (from_id) RE
35、FERENCES User_Info (user_id), FOREIGN KEY (to_id) REFERENCES User_Info (user_id) ) ENGINE = InnoDB; 2、Web注冊頁面模塊 用戶管理:用于管理用戶的注冊和登陸。 添加好友:查詢數(shù)據(jù)庫中注冊用戶,選擇要添加的好友插入數(shù)據(jù)庫。 3、聊天程序服務(wù)器端 初始化套接口,初始化RSA算法生成公鑰和私鑰 -> 創(chuàng)建線程池等待連接 -> 送出RSA公鑰 -> 接收DES密鑰 -> 驗證登陸信息 -> 服務(wù)登陸客戶負(fù)責(zé)消息轉(zhuǎn)發(fā)。 4、聊天程序客戶端 初始化套接口,生成DES密鑰,向服務(wù)器發(fā)起連
36、接 -> 取得RSA公鑰加密DES密鑰后回傳服務(wù)器 -> 發(fā)送登陸信息 -> 接收好友信息 -> 創(chuàng)建發(fā)送消息線程和接收消息線程與好友通信。 5系統(tǒng)實現(xiàn) 5.1 DES核心代碼 l DES類聲明 class DES { public : DES (unsigned long long); //構(gòu)造函數(shù)僅傳入密鑰 void encrypting (unsigned long long &); //加密函數(shù) void decrypting (unsigned long long &); //解密函數(shù) private : //明文處理=============
37、================================= bitset<64> IP_permute (unsigned long long); //初始置換 unsigned long long IP_1_permute (bitset<64>); //逆置換 //加密過程============================================== bitset<48> E_permute (bitset<32>);//E盒子置換 unsigned long long b1b6 (bitset<48>, int, int); uns
38、igned long long b2b3b4b5 (bitset<48>, int, int, int, int); bitset<32> SBox_Process (bitset<48>); //S盒子置換 void P_permute (bitset<32> &); //P置換 bitset<32> f (bitset<32>, bitset<48>); //f函數(shù) //子密鑰生成============================================ bitset<56> PC_1_permute (unsigned long long); /
39、/PC-1置換 void LSi (bitset<28> &, int); //循環(huán)左移 bitset<48> PC_2_permute (bitset<56>); //PC-2置換 void create_k (unsigned long long); bitset<48> k[16]; //子密鑰數(shù)組 }; l 子密鑰生成 void DES :: create_k (unsigned long long key) { bitset<56> CiDi (0); CiDi = PC_1_permute (key); //PC-1置換 bitset<2
40、8> Ci (0), Di (0); for (int i = 0; i < 56; i++) { //將經(jīng)過PC-1置換的數(shù)據(jù)分成左右28比特 if (i < 28) Ci[i] = CiDi[i]; else Di[i - 28] = CiDi[i]; } for (int i = 0; i < 16; i++) //16輪循環(huán) { LSi (Ci, LSI[i]); //LS循環(huán)左移 LSi (Di, LSI[i]); //LS循環(huán)左移 for (int j = 0; j < 56; j++) //再將28比特數(shù)據(jù)合
41、為56比特數(shù)據(jù) { if (j < 28) CiDi[j] = Ci[j]; else CiDi[j] = Di[j - 28]; } k[i] = PC_2_permute (CiDi); //存入子密鑰數(shù)組 } } l 加密算法 void DES :: encrypting (unsigned long long &msg) { bitset<64> ip (0); bitset<32> Li (0), Ri (0), buf (0); ip = IP_permute (msg); //IP初始置換 for
42、(int i = 0; i < 64; i++) //等分成左右32位數(shù)據(jù) { if (i < 32) Li[i] = ip[i]; else Ri[i - 32] = ip[i]; } for (int i = 0; i < 16; i++) //16輪迭代 { if (i != 15) { buf = Li; Li = Ri; //Li = Ri-1 Ri = f (Ri, k[i]); //f函數(shù)處理Ri-1 Ri ^= buf; //Ri = f (Ri-1, ki) XOR Li-1 }
43、 else { //最后不再互換 buf = Ri; Ri = f (Ri, k[i]); Li ^= Ri; Ri = buf; } } for (int i = 0; i < 64; i++) //將兩部分32數(shù)據(jù)組合回64位數(shù)據(jù) { if (i < 32) ip[i] = Li[i]; else ip[i] = Ri[i - 32]; } msg = IP_1_permute (ip); //IP-1 逆置換 return; } 5.2 RSA核心代碼 l 大數(shù)類聲明 cla
44、ss BigNum { public : BigNum (char *a = NULL, unsigned long n = 0, Status s = 0); ~BigNum () {}; BigNum absadd (BigNum, BigNum); //絕對值相加 BigNum abssub (BigNum, BigNum); //絕對值相減 BigNum operator + (BigNum); //加號重載 BigNum operator - (BigNum); //減號重載 BigNum operator * (BigNum);
45、//乘號重載 BigNum operator / (BigNum); //除號重載 BigNum operator % (BigNum); //取余重載 BigNum square (); //乘方運算 BigNum & operator <<= (unsigned long); //循環(huán)左移 BigNum & operator >>= (unsigned long); //循環(huán)右移 friend bool operator < (BigNum, BigNum); //<重載為友元 friend bool operator > (BigNum, Big
46、Num); //>重載為友元 friend bool operator >= (BigNum, BigNum); //>=重載為友元 friend bool operator == (BigNum, BigNum); //==重載為友元 friend bool operator != (BigNum, BigNum); //!=重載為友元 void print (); unsigned long getsize () {return (size);} char *getnum () {return (num);} private : char nu
47、m[MAXNUM]; unsigned long size; Status symbol; //正數(shù)為1,零為0,負(fù)數(shù)為-1 }; l 模冪運算 BigNum modexp (BigNum x, BigNum r, BigNum p) { //依據(jù)定理 (a * b)mod n = ((a mod n) * (b mod n)) mod n BigNum a, b, c ("1", 1, 1), one ("1", 1, 1), zero ("0", 1, 0), two ("2", 1, 1); a = x; b = r; while (b != zero
48、) { if (b % two == zero) //是否為偶數(shù) { b = b / two; //降階 a = a.square () % p; //乘方對p取余 continue; } b = b - one; c = (a * c) % p; //乘模運算 } return (c); } l 歐幾里德計算最大公因數(shù)和逆元 BigNum RSA :: gcd (BigNum &a, BigNum &b, BigNum x, BigNum y) { //gcd (x, y) = gcd (y, x mod y), 對式
49、子ax + by = r, //每一步迭代中ai = ai-2 – q * ai-1, bi = bi-2 – q *bi-1 //其中q 為當(dāng)前這步的商 BigNum zero ("0", 1, 0); BigNum q, r, ai_2 ("1", 1, 1), ai_1 ("0", 1, 0), bi_2 ("0", 1, 0), bi_1 ("1", 1, 1); if (x < y) //x、y互換 { BigNum c = y; y = x; x = c; } r = y; while ((x % r) != zero) //輾轉(zhuǎn)
50、相除 { y = x; x = r; q = y / r; r = y % r; a = ai_2 - (q * ai_1); //迭代前兩步x,y逆元表達式系數(shù) b = bi_2 - (q * bi_1); ai_2 = ai_1; bi_2 = bi_1; ai_1 = a; bi_1 = b; } return (r); } l Miller-Rabin素性測試 bool Prime_Num :: Miller_Rabin (BigNum n, BigNum b) { //令n – 1 = 2^lm,其中l(wèi)是
51、非負(fù)整數(shù),m是正奇數(shù)。 //若b^m = 1 (mod n) 或 b^(2^j)m = (n - 1) mod n 0<=i <= j -1 //則稱n通過以b為基的Miller-Rabin測試 BigNum m, j ("0", 1, 0), one ("1", 1, 1), two ("2", 1, 1), zero ("0", 1, 0); BigNum v; m = n - one; while ((m % two) == zero) //將n-1處理為2的l次方乘以m { m = m / two; j = j + one; } i
52、f (b < two) { cout << "ERROR b!" << endl; exit (0); } v = modexp (b, m, n); if (v == one) //若b的m次方對n取余等于1通過測試 return (true); BigNum i ("0", 1, 0); while (i < j) { if (v == (n - one)) //滿足b^(2^j)m = (n - 1) (mod n),測試結(jié)束 return (true); v = v.square () % n; i = i + o
53、ne; } return (false); } 5.3 Web注冊頁面核心代碼 l 用戶管理
54、ValidUserName ($in_user_name) //用正則表達式檢測輸入名字的合法性 { if ($in_user_name == or !ereg ("[[:alnum:]_-]{1,50}", $in_user_name)) return FALSE; else return TRUE; } public function isValidPassWord ($in_passwd) //檢測輸入密碼的合法性 { if ($in_passwd == or strlen ($in_passwd) < 4 or s
55、trlen ($in_passwd) > 10) { echo "password len " . strlen ($in_passwd); return FALSE; } else return TRUE; } public function createAccount ($in_uname, $in_pw, $in_sex, $in_age, $in_address) { //創(chuàng)建賬戶,插入數(shù)據(jù)庫 if (!$this->isValidUserName ($in_uname)) { //檢查用戶名是否正
56、確,如果錯誤給出相應(yīng)錯誤提示
echo <<
57、是否正確,如果錯誤給出相應(yīng)錯誤提示
echo <<
58、 $conn->autocommit (FALSE); //關(guān)閉自動提交至數(shù)據(jù)庫為事務(wù)處理狀態(tài)
$qstr = <<
59、 { $conn->rollback (); //出錯后事務(wù)回滾 echo "Insert User_Info false. message : ".$conn->error; exit; } $user_id = $conn->insert_id; $result2 = @$conn->commit (); //提交查詢 if ($result2 === FALSE) { echo "Commit Insert false. message : ".$conn->error; exit; }
60、 $conn->close (); //關(guān)閉數(shù)據(jù)庫連接
return $user_id; //返回用戶賬號
}
public function userLogin ($user_id, $in_password) //處理用戶登錄
{
$conn = $this->getConnection (); //連接數(shù)據(jù)庫
$check = << 61、}
CHECK;
$result = @$conn->query ($check); //執(zhí)行查詢語句
if ($result === FALSE)
{
echo select User_Info false! message: .$conn->error;
exit;
}
if (($row = $result->fetch_assoc ()) === NULL)
{ //檢查登陸用戶信息是否正確,如果錯誤返回FALSE
$conn->close ();
return FALSE;
}
62、$conn->close ();
return $row;
}
private function getConnection () //連接數(shù)據(jù)庫
{
$conn = @new mysqli (localhost, andy, andy2000, FreeChat);
if (mysqli_connect_errno () != 0)
{
$errno = mysqli_connect_errno (); //獲取數(shù)據(jù)庫連接錯誤號
$errmsg = mysqli_connect_error (); //獲取數(shù)據(jù)庫連接錯誤信 63、息
echo Connect database failed with: ($errno) $errmsg.;
exit;
}
return $conn;
}
}
?>
5.4服務(wù)器端核心代碼
圖5.1 服務(wù)器完成初始化
圖5.1為服務(wù)器初始化過程和為已登錄用戶服務(wù)的過程。服務(wù)器先生成RSA算法所需的公鑰和私鑰,當(dāng)連接到來時服務(wù)器送出RSA公鑰并等待用戶回傳DES密鑰。當(dāng)用戶傳回DES密鑰后,服務(wù)器用RSA私鑰解密得到DES密鑰。此后用戶登錄信息由此DES密鑰解密,用戶發(fā)送的消息由服務(wù)器轉(zhuǎn)發(fā)。
l 線程函數(shù),為登陸客戶服務(wù)
void 64、 service (int connfd, RSA rsa)
{
char buf[MAXLINE];
user_login *login;
int n, check;
unsigned long long key;
publickey pk;
pk.e = rsa.e;
pk.n = rsa.n;
send_rsa_publickey (connfd, pk); //發(fā)送RSA公鑰
cout << "公鑰已送出!" << endl;
cerr << "正在獲取des密鑰,請稍后...................................." 65、 << ends;
key = getdeskey (connfd, rsa); //獲取DES私鑰
cout << "ok" << endl;
if (key == 0)
return;
if ((n = readn (connfd, (void *)buf, MAXLINE)) < 0) //從套接口上讀取用戶登陸信息
{
cout << "Read from socket connfd false! message: " << strerror (errno) << endl;
exit (ERROR);
}
else if (n == 0)
66、
{
cout << "The client close socket." << endl;
return;
}
login = (user_login *)buf;
DES_Data *data = new DES_Data ((void *)login->password, 16, key);
bcopy ((void *)data->Decrypting (), (void *)login->password, 11); //解密用戶登陸口令
cout << "No." << login->user_id << "請求登錄..." << endl;
if (!(check = Attestation (connfd, login))) //認(rèn)證用戶登陸消息
{
cout << "Wrong user name or wrong password!" << endl;
cout << "登錄失敗!" << endl;
return;
}
else
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責(zé)述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案