[優(yōu)秀畢業(yè)論文]安全聊天系統(tǒng)的設計與實現
《[優(yōu)秀畢業(yè)論文]安全聊天系統(tǒng)的設計與實現》由會員分享,可在線閱讀,更多相關《[優(yōu)秀畢業(yè)論文]安全聊天系統(tǒng)的設計與實現(31頁珍藏版)》請在裝配圖網上搜索。
1、 《安全聊天系統(tǒng)的設計與實現》 第31頁 共32頁 安全聊天系統(tǒng)的設計與實現 學生姓名:xxx 指導老師:xxx 摘 要 隨著計算機的不斷普及和互聯(lián)網技術在全球領域的高速發(fā)展。越來越多的人使用到了聊天程序。聊天程序給人們帶來通信便利的同時也存在著一些安全隱患,傳統(tǒng)的聊天程序以明文方式傳送聊天內容,這樣就給一些用心不良的人大開方便之門。本系統(tǒng)正是基于以上原因而設計的加密聊天程序。聊天程序采用服務器/客戶端模式。在Linux環(huán)境下采用socket套接口編程,服務器程序以創(chuàng)建線程池的方式為每一個客戶服務。聊天內容由服務器轉發(fā)。在聊天程序中加入了對稱加密
2、算法DES和非對稱加密算法RSA。其基本實現是由服務器端生成RSA的公鑰和私鑰,由客戶端生成DES對稱密鑰,服務器端傳送公鑰至客戶端加密DES密鑰之后回傳服務器,服務器再用本地的私鑰解密獲得DES密鑰。此后雙方的通信由DES密鑰加密后傳送,這樣既能高效的加密明文又能在信道上安全的傳送密鑰使得密鑰間的共享成為現實。 關鍵詞 對稱加密算法;非對稱加密算法;聊天系統(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é)議族成為計算機通信的主要網絡協(xié)議,基于該
7、協(xié)議族開發(fā)的網絡應用程序數不勝數。聊天程序便是其中之一。聊天程序使人們可以通過互聯(lián)網及時傳送消息,讓遠在千里之外的人們暢所欲言。傳統(tǒng)的聊天程序在給人們帶來方便的同時也逐漸暴露出一些安全隱患。前不久網上登出了這樣一則新聞:上海某銀行的白領麗人,因為聊天程序受監(jiān)控被同事知道了個人隱私,被迫辭去了月薪三萬余元的工作。于是聊天程序的安全性受到了人們的廣泛關注。 1.2 國內外研究現狀 從國內外對聊天程序的加密情況看,大多數處理方式是在現有的聊天程序基礎之上添加相應的加密插件來實現加密。比較典型的例子是Linux平臺下的多集成聊天程序Gaim,其中集成了ICQ、MSN、QQ等現今主流國內外聊天程序
8、。普遍的聊天程序沒有經過加密而直接傳輸聊天明文。Gaim通過添加插件程序對未加密的聊天程序進行加密傳輸,通信雙方需要只要同時安裝加密插件就可以順利的對聊天內容進行加密解密。這其中存在一個現而易見的問題:要是一方加入了加密插件而另一方卻沒有相應的解密程序顯然雙方不能正確通信。 1.3 本課題研究的意義 聊天程序是否加密關系著用戶的切身利用。為了保衛(wèi)公民隱私權不受到網絡黑客的不法侵犯,開發(fā)加密傳輸信息的聊天程序有著重大意義。聊天程序的加密特性對用戶應該是透明的。正如前面分析,如果以安裝插件的方式加密聊天程序很可能造成通信雙方加密不一致的情況。因此將加密算法內嵌入聊天程序可以保證通信雙方均能正
9、常通信。 傳統(tǒng)的對稱加密算法如DES雖然可以快速的加密和解密明文,然而其密鑰難以分配和管理。如果讓通信雙方相互約定密鑰顯然是不合適的,因此最好的方式是由一方產生密鑰然后傳送給另一方?;诠€的非對稱加密體制的引入正是用于解決對稱加密算法在密鑰管理上的不足,但是非對稱加密算法如RSA存在運算強度過大、費時較長等問題。如果直接用于加密聊天程序,其生成密鑰和加密解密所需時間是人們在通信過程中所不能容忍的,采取將兩種加密算法相結合的方式可以很好的解決以上問題,從而達到安全快速的加密數據。 2所采用技術的先進性分析 2.1 DES算法 DES是Data Encryption Standard
10、(數據加密標準)的縮寫。它是由IBM公司研制的一種加密算法,美國國家標準局于1977年公布把它作為非機要部門使用的數據加密標準,二十年來,它一直活躍在國際保密通信的舞臺上,扮演了十分重要的角色。 DES是一個分組加密算法,它以64位為分組對數據加密。同時DES也是一個對稱算法:加密和解密用的是同一個算法。它的密鑰長度是56位(因為每個第8位都用作奇偶校驗),密鑰也可以是任意的56位數,而且可以任意時候改變。其中有極少量的數被認為是弱密鑰,但是很容易避開它們。所以保密性依賴于密鑰。 2.2 RSA算法 1978年,美國麻省理工學院(MIT)的研究小組成員Ronald L Rivest、Ad
11、i Shamir、 Leonard Adleman提出了一種基于公開密鑰密碼體制的優(yōu)秀加密算法--RSA算法。RSA的取名就是來自這三位發(fā)明者姓氏的第一個字母。該算法以其較高的保密強度逐漸成為一種廣為接受的公鑰密碼體制算法。RSA算法是一種分組密碼體制算法,它的保密強度是建立在具有大素數因子的合數,其因子分解NP(Nondeterministic Polynomial)完全問題這一數學難題的基礎上的,因此RSA算法具有很強的保密性。 RSA算法研制的最初目標是解決DES算法秘密密鑰利用公開信道傳輸分發(fā)困難的難題,而實際結果不但很好地解決了這個難題;還可利用RSA來完成對消息的數字簽名以防對消
12、息的抵賴;同時還可以利用數字簽名發(fā)現攻擊者對消息的非法篡改,以保護數據信息的完整性。 RSA算法是第一個能同時用于加密和數字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,普遍認為是目前最優(yōu)秀的公鑰方案之一。RSA得到了世界上的最廣泛的應用,并于1992年ISO國際標準化組織在其頒發(fā)的國際標準X.509中,將RSA算法正式納入國際標準。 2.3 線程池 在傳統(tǒng)的UNIX模型中,當一個進程需要另一個實體來完成某事時,它就fork一個子進程并讓子進程去執(zhí)行處理。Unix上的大多數網絡服務器程序就是這么編寫的,父進程accept一個連接,fork一個子進程,該子進程處理與該連接
13、對端的客戶之間的通信。 盡管這種范式多少年來一直良好地服務著,fork調用卻存在一些問題:1 fork是昂貴的。fork要把父進程的內存映象拷貝到子進程,并在子進程中復制所有描述字,如此等等。2 fork返回之后父進程之間信息的傳遞需要進程間通信(IPC)機制。調用fork之前父進程向尚存在的子進程傳遞信息相當容易。因為子進程將從父進程數據空間及所有描述字的一個拷貝開始運行。然而從子進程往父進程返回信息卻比較費力。 線程有助于解決這兩個問題。線程有時稱為輕權進程(lightweight process),因為線程比進程“權重輕些”。也就是說,線程的創(chuàng)建可能比進程的創(chuàng)建快10~100倍。
14、 線程池是指在服務器啟動階段預先創(chuàng)建一系列線程阻塞于accept調用,每個客戶由當前可用線程池中的某個(閑置)線程處理。這種處理方式比通常的客戶連接到來時臨時創(chuàng)建線程為其服務要快得多??梢垣@得很好的性能加速。 3系統(tǒng)需求分析 3.1聊天程序功能分析 1 注冊功能 通常聊天程序需要用戶名和密碼才能使用,所以需要實現web注冊功能,這樣用戶可以很方便的通過web網站注冊自己的用戶名并取得密碼,還可以在服務器上存儲個人相關信息以便他人查看。 2 登陸功能 用戶在聊天之前需要輸入用戶名和
15、密碼進行登陸以便獲取自身相關信息和好友相關信息,故登陸過程中服務器需對用戶名和密碼進行必要的核對。 3 聊天功能 這是聊天程序的主要功能。用戶之間的相互通信必須及時快速的由服務器轉發(fā)。 3.2 加密算法 由于是加密聊天程序,故對聊天明文的加密算法應選取加密速度相對較快的對稱加密算法(如:DES),又由于DES的加密密鑰是不能公開的秘密密鑰,故對DES的密鑰應加密傳送,所以應采用非對稱的公鑰加密算法(如RSA)用以分發(fā)DES密鑰。 DES加密算法: 作為對稱加密算法中的DES加密算法由于其加密過程是固定不變的,故應考慮其密鑰的生成。由于弱密鑰存在的可能性,還應該考慮如何避免生成弱密鑰
16、。因為差分分析法的提出可以快速的破解少于16輪迭代的DES算法,故應保證其迭代次數至少為16輪。 RSA加密算法: 由于RSA是基于大素數因子分解這一數學難題提出的,故RSA中公鑰和私鑰的產生應重點考慮。又由于RSA的運算強度較大,故還應考慮如何加速其運算速度。 4 系統(tǒng)總體設計和模塊劃分 4.1 系統(tǒng)總體設計 圖4.1系統(tǒng)設計 如圖4.1所示,本系統(tǒng)采用C/S模式。 1 用戶通過web應用程序注冊帳號,然后用注冊的帳號登陸聊天程序服務器。 2 客戶端產生生成DES密鑰,服務器端在啟動時初始化產生RSA公鑰和私鑰。當客戶端向服務器發(fā)起連接時,服務器送
17、出RSA公鑰,客戶端用取得的公鑰加密產生的DES私鑰回傳服務器。 3 最后服務器與客戶端雙方的通信均由DES加密算法加密通信明文。 4.2 模塊劃分 4.2.1 DES算法模塊 1 加密算法3個主要步驟 第一步,初始置換IP 圖4.2 初始置換表IP 圖4.2為初始置換表IP,64bit輸入明文經過該表完成初始置換。 第二步,16輪迭代 圖4.3 16輪迭代 圖4.3為DES16輪迭代,將經過初始置換的數據分成Li和Ri兩部分。將Ri直接交換為Li+1,Li與Ri經過f函數處理后的數據相異或得Ri+1,最后一輪不做交換。 第三步,逆置換 圖4.4 逆
18、置換表(IP-1) 圖4.4為逆置換表(IP-1),經過16輪迭代后通過該表置換得到輸出的密文。 2 子密鑰的產生 圖4.5 生成子密鑰 圖4.5為子密鑰生成過程,將64bit初始密鑰經過PC-1表置換為56bit輸入,分為Ci, Di兩組分別進行LS循環(huán)左移,再經過PC-2表壓縮為48bit子密鑰。如此循環(huán)16輪生成16組子密鑰。 4.2.2 RSA算法模塊 1 大數的運算 加法運算: 設定相應的進位變量c,按位相加,如ri = ai + bi + c,當ai + bi + c > m (m為權值),c送1,ri = (ai + bi + c) mod m, 否則c送
19、0。 減法運算: 設定相應的借位變量c,按位相減,如ri = ai – bi + c,當ai < bi時,c送m (m為權值),還要將ai高一位減1,如過高位連續(xù)為0則依次置m – 1,一直到第一個非0位并將其減1,否則c送0。 乘法運算: 設定相應的進位變量c,和一個取當前結果位值變量d,雙重循環(huán)。外層循環(huán)依次取運算數A的相應位,內層循環(huán)依次取B的相應位。r(i + j) = d + ai * bj + c,當d + ai * bi + c > m (m位權值),c送ri/m (m為權值),d為從對應的內外循環(huán)位之和(i + j)對應的結果位上取得的值。r(i + j)暫時存入對應的
20、結果位。 除法運算: 假設A為被除數,B為除數。當A > B,將B擴大到A相同位數,循環(huán)做A = A – Bk (擴充后的B),商位qi = qi + 1,最后A為余數。 取余運算: 依除法運算輸出余數A。 乘方運算: 與乘法運算一樣設有進位變量c和取當前結果位值變量d。依然分內外兩層循環(huán)。外層循環(huán)中d = r (2 * i),r(2 * i) = d + ai * ai,在此僅計算相同位ai的乘積存入結果位r(2 * i)中。內層循環(huán)d = r (i + j),r(i + j) = d + 2 * ai * aj + c,這里由于乘數A和被乘數B相等,故可以采用2 * ai *
21、aj,這種方式提前運算對應位??梢钥闯鲞@種預處理方式加快了運算速度。 模冪運算: 將模冪運算轉化為乘模運算。定理:(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 先以生成隨機數的方式生成隨機奇數A、B。再讓A、B依次通過Miller-Rabin素性測試。 Miller-Rabin素性測試:先計算出m、j,使得n-1=m*2^j,其中
22、m是正奇數,j是非負整數,隨機取一個b,2<=b,計算v=b^m mod n,如果v==1,通過測試,返回。令i=1,循環(huán)以后步驟,如果v=n-1,通過測試,返回。如果i==j,非素數,結束。v=v^2 mod n,i=i+1。 3 歐幾里德算法求a,b最大公因數和逆元 定理:gcd (a, b) = gcd (b, a mod b) (設a > b) r = a mod b, a = b,b = r 循環(huán)以上三步直到r = 0, 則a為所求最小公因數。r = a mod b => x * a + y * b = r。 x稱為a的逆元。在每步循環(huán)過程中將前一步中的r代入下一步中合并后可求
23、得逆元x。 4.2.3 DES和RSA安全性討論 1 弱密鑰 所謂的弱密鑰是指在所有可能的密鑰中,有某幾個特別的密鑰,會降低DES的安全性,所以使用者一定要避免使用這幾個弱密鑰。而弱密鑰產生的原因是由于子密鑰產生過程的設計不當所導致的。 由子密鑰產生的過程來看,假設有某個初始密鑰經過密鑰初始置換表置換,使得寄存器C0與D0的內容成為全是“0”或全是“1”的數據。如此一來,不管以后的每一輪中之循環(huán)左移函數是如何地變化,Ci與Di的內容并不會有所改變的。換句話說,這樣的初始密鑰,將會產生16個一摸一樣的子密鑰。如此一來將大大地降低DES的安全性。 弱密鑰有另外一個特性-對弱密鑰而言,其加
24、密與解密的過程是完全一樣的。我們知道DES的加密與解密過程中,唯一的不同在于子密鑰的使用順序是相反的。然而對弱密鑰而言,因為其所衍生的16個子密鑰是完全相同的,故子密鑰之間也就毫無順序之分了。 2 半弱密鑰 除了上述的弱密鑰之外,還有另外一種稱之為半弱密鑰的初始密鑰。其特性是此類初始密鑰所產生的子密鑰,只有兩種可能。而每一種可能的子密鑰,剛好各出現8次。 假設現在有兩個位串:A=0101…0101,與B=1010…1010,那么無論如何對A做循環(huán)左移動作,其結果不是A就是B。當然對B做循環(huán)左移動作也會得到一樣的結果。如果對某個弱密鑰而言,它滿足以下兩個條件,那么它就屬于以上所謂的半弱密鑰
25、了。 (1)子密鑰排列中的C(或D)寄存器只含有0101,…,0101或1010,…,1010這兩種形式的數據。 (2)另一個寄存器D(或C)含有0000,…,0000,1111,…,1111,0101,…,0101或1010,…,1010任何一種形式的數據。 3 差分分析法 差分分析法基本上是屬于選擇明文攻擊法。但在某些特定的情形下,也可用于已知明文攻擊。這個方法簡單地說,就是分析特殊明文配對(Plaintext Pair)的差值相對應的密文配對(Ciphertext Pair)的差值所產生的影響。這里所謂的差值是指兩個明文(或密文)之間做異或(XOR)所得到的值。 這個做法的主要
26、概念在于差值的運算會使得DES變得簡單許多。我們知道DES可看做一部非常復雜的非線性機器,即使知道某一明文對應的密文,若無法得知密鑰,也很難去推導出這一部機內部的數據流。當在差值的概念下,就有機可趁了。 對DES中的某個差值而言,最多的可以有2的64次方個明文(或密文)配對與之對應。差分密碼分析法所在乎的是差值本身,而非其所對應的明文(或密文)配對。而某些特殊的差分密碼分析法就是選取許多擁有相同特征值的明文配對,加密后得到相對應的密文配對,再借著特征值與這些密文配對推導出一些可能的密鑰,并附與可能的概率,最后再選出最有可能者。 B. RSA安全性討論 不可使用公共的模N 在某些情況下,
27、我們假設有一密鑰產生中心(Key Generation Center, KGC),利用RSA系統(tǒng)產生一公共模N = pq。此中心接著產生許多對的加密與解密密鑰{ei,di},并將解密密鑰di秘密傳送給使用者i,且公布ei為使用者i的公開密鑰。此系統(tǒng)的優(yōu)點為密鑰管理非常簡單,因為系統(tǒng)中使用公共的模(N),不會有Reblocking問題產生,且可節(jié)省公開密鑰的存儲空間。不過,RSA系統(tǒng)使用公共的模,卻可能招致下列三個主要的問題,使得此系統(tǒng)并不安全。 1 若相同的明文m分送給兩個不同的使用者,則此系統(tǒng)可能變得不安全 設預將明文m加密后分送給使用者i及j,則其密文分別為Ci = m^ei mod
28、 N及Cj = m^ej mod N。 若使用者i與j的公開密鑰ei與ej互素,則由歐幾里德算法可求得兩整數r及s使得rei + sej = 1。 很明顯地,r或s一定有一個為負數,即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。其基本概念為找出一整數b使得 (1) b^2 = 1 mod N (2) b != +- 1 mod N (3) 1 < b < N 由基本數論知,若N = pq,滿足上述條件的b共有兩個。若能找出任一個,則我們即可將N因子分解。因為b^2 -1 = 0 mod N, 則(b + 1)(b - 1) = 0 mod N, 所以(b + 1)(b -1) = kN = kqp, 其中k為整數。 由于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情況下,求出另一對加解密密鑰。 設已擁有一對加/解密密鑰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、求出兩整數r1及d1,使得r1f + d1e1 = 1。 由于g整除ed – 1,因此f必為整數,且f必為f(N)的整數倍,這是由于f(N)整除ed – 1,且g與f(N)互素。當f求出后,第(3)步中,我們求出d1即滿足d1e1 = 1 mod f(N)。因為f為f(N)的整數倍。 4.2.4 聊天程序模塊 1、數據庫設計 用戶信息表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; #指定存儲引擎 好友關系表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 (記錄已登陸的在線用戶和與服務器建立的套接口) 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注冊頁面模塊 用戶管理:用于管理用戶的注冊和登陸。 添加好友:查詢數據庫中注冊用戶,選擇要添加的好友插入數據庫。 3、聊天程序服務器端 初始化套接口,初始化RSA算法生成公鑰和私鑰 -> 創(chuàng)建線程池等待連接 -> 送出RSA公鑰 -> 接收DES密鑰 -> 驗證登陸信息 -> 服務登陸客戶負責消息轉發(fā)。 4、聊天程序客戶端 初始化套接口,生成DES密鑰,向服務器發(fā)起連
36、接 -> 取得RSA公鑰加密DES密鑰后回傳服務器 -> 發(fā)送登陸信息 -> 接收好友信息 -> 創(chuàng)建發(fā)送消息線程和接收消息線程與好友通信。 5系統(tǒng)實現 5.1 DES核心代碼 l DES類聲明 class DES { public : DES (unsigned long long); //構造函數僅傳入密鑰 void encrypting (unsigned long long &); //加密函數 void decrypting (unsigned long long &); //解密函數 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函數 //子密鑰生成============================================ 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]; //子密鑰數組 }; 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++) { //將經過PC-1置換的數據分成左右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比特數據合
41、為56比特數據 { if (j < 28) CiDi[j] = Ci[j]; else CiDi[j] = Di[j - 28]; } k[i] = PC_2_permute (CiDi); //存入子密鑰數組 } } 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位數據 { 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函數處理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數據組合回64位數據 { 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 大數類聲明 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; //正數為1,零為0,負數為-1 }; l 模冪運算 BigNum modexp (BigNum x, BigNum r, BigNum p) { //依據定理 (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) //是否為偶數 { b = b / two; //降階 a = a.square () % p; //乘方對p取余 continue; } b = b - one; c = (a * c) % p; //乘模運算 } return (c); } l 歐幾里德計算最大公因數和逆元 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 為當前這步的商 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) //輾轉
50、相除 { y = x; x = r; q = y / r; r = y % r; a = ai_2 - (q * ai_1); //迭代前兩步x,y逆元表達式系數 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、非負整數,m是正奇數。 //若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),測試結束 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)建賬戶,插入數據庫 if (!$this->isValidUserName ($in_uname)) { //檢查用戶名是否正
56、確,如果錯誤給出相應錯誤提示
echo <<
57、是否正確,如果錯誤給出相應錯誤提示
echo <<
58、 $conn->autocommit (FALSE); //關閉自動提交至數據庫為事務處理狀態(tài)
$qstr = <<
59、 { $conn->rollback (); //出錯后事務回滾 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 (); //關閉數據庫連接
return $user_id; //返回用戶賬號
}
public function userLogin ($user_id, $in_password) //處理用戶登錄
{
$conn = $this->getConnection (); //連接數據庫
$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 () //連接數據庫
{
$conn = @new mysqli (localhost, andy, andy2000, FreeChat);
if (mysqli_connect_errno () != 0)
{
$errno = mysqli_connect_errno (); //獲取數據庫連接錯誤號
$errmsg = mysqli_connect_error (); //獲取數據庫連接錯誤信 63、息
echo Connect database failed with: ($errno) $errmsg.;
exit;
}
return $conn;
}
}
?>
5.4服務器端核心代碼
圖5.1 服務器完成初始化
圖5.1為服務器初始化過程和為已登錄用戶服務的過程。服務器先生成RSA算法所需的公鑰和私鑰,當連接到來時服務器送出RSA公鑰并等待用戶回傳DES密鑰。當用戶傳回DES密鑰后,服務器用RSA私鑰解密得到DES密鑰。此后用戶登錄信息由此DES密鑰解密,用戶發(fā)送的消息由服務器轉發(fā)。
l 線程函數,為登陸客戶服務
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))) //認證用戶登陸消息
{
cout << "Wrong user name or wrong password!" << endl;
cout << "登錄失敗!" << endl;
return;
}
else
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。