導航:首頁 > 編程語言 > java通訊機

java通訊機

發布時間:2024-04-28 19:25:30

㈠ 如何用java語言對即時通訊軟體進行加密

一、Java軟體加密基本思路
對於應用軟體的保護筆者從兩個方面進行考慮,第一是阻止盜版使用軟體,第二是阻止競爭對手對軟體反編譯,即阻止對軟體的逆向工程。
1、阻止盜版
在軟體運行時對自身存在的合法性進行判斷,如果認為自身的存在和運行是被授權的、合法的,就運行;否則終止運行。這樣即使軟體可以被隨意復制,只要盜版用戶沒有相應的授權信息就無法使用軟體。
2、阻止反編譯
對編譯產生的Class文件加密處理,並在運行時進行解密,解密者無法對軟體進行反編譯。
二、Java軟體加密的總體流程
為了保護用Java語言開發的軟體,我們設計並實現了一個實用、高強度的加密演算法。以下稱需要保護的Java軟體為「受保護程序」,稱對「受保護程序」進行加密保護的軟體為「加密程序」。對軟體加密保護的流程如圖1所示。

三、加密演算法分析設計
1、用戶信息提取器設計
為了防止用戶發布序列號而導致「一次發行,到處都是」的盜版問題,提取用戶機器中硬體相關的、具有唯一性的信息——用戶計算機的硬碟分區C的序列號,並要求用戶將此信息與用戶名一起返回,之後用「序列號生成器」根據用戶返回信息生成一個唯一合法的軟體注冊序列號發回用戶,用戶即可使用此號碼注冊使用軟體。
這個信息提取器使用Winclows 32匯編以一個獨立的小程序方式實現,程序代碼如圖2所示。

2、序列號生成器與序列號合法性判斷函數的設計
序列號生成器與序列號合法性判斷函數中運用RSA加密演算法。在序列號生成器中是使用私鑰將用戶返回的信息(硬碟序列號,用戶名)進行加密得到相應的注冊序列號;在序列號合法性判斷函數中使用私鑰將用戶輸入的注冊序列號解密,再與(硬碟序列號,用戶名)進行比較,一致則調用程序裝載器將程序其他部分解密裝入內存,初始化刪環境並運行程序主體;否則退出。
RSA加密演算法的實現需要使用大數運算庫,我們使用MIRACL大數庫來實現RSA計算,序列號生成器的主要代碼如下:
char szlnputString[]=」機器碼和用戶名組成的字元串」;
char szSerial[256]=[0];//用於存放生成的注冊碼
bign,d,c,m; //MIRACL中的大數類型
mip→IBASE=16; //以16進制模式
n= mlrvar(0); //初始化大數
d= mirvar(0);
c= mirvar(0); //C存放輸入的字元串大數
m= mlrva(o);
bytes to big( len, szlnputString,c);
//將輸入字元串轉換成大數形式並存入變數c中
cinstr(n,」以字元串形成表示的模數」);//初始化模數
cinstr(d,」以字元串形成表示的公鑰」)://初始化公鑰
powmod(c,d,n,m); //計算m=cdmod n
cotstr(m,szSerial);//m的16進制字元串即為注冊碼
序列號合法性檢測函數的主要代碼如下:
char szlnputStringL]=」機器碼和用戶名組成的字元串」;
char szSerial[ 256]=」用戶輸入的序列號」
bign,e,c,m; //MIRACL中的大數類型
mip→IBASE=16; //以16進制模式
cinstr(m,szSerial); //將序列號的16進制轉成大數形式
cinstr(n,」模數n的字元串形式」);//初始化模數n
cinstr(e,」字元串形式的公鑰」);//初始化公鑰
if compare(m,n)==-1) //m<n時才進行解密
{
powmod(m,e,n,c);//計算m=me mod n
big_to _bytes(0,c,szSerial,0); //轉為字元串
return lstrcmp( szlnputString,szSerial);
}
3、強耦合關系的設計
如果在序列號合法性檢測函數中簡單地使用圖3所示流程:

解密者可以使用以下幾種手段進行攻擊:
(1)修改「判斷合法性子函數」的返回指令,讓它永遠返回正確值,這樣可以使用任意的序列號,安裝/使用軟體。
(2)修改判斷後的跳轉指令,使程序永遠跳到正確的分支運行,效果和上一種一樣。
(3)在「判斷合法性子函數」之前執行一條跳轉指令,繞過判斷,直接跳轉到「正常執行」分支運行,這樣可以不用輸入序列號安裝/使用軟體。
為阻止以上攻擊手段,筆者在程序中增加了「序列號合法性檢測函數」與程序其他部分「強耦合」(即增強其與程序其他部分的關聯度,成為程序整體密不可分的一部分,一旦被修改程序將無法正常工作)的要求(見圖1),並且設置一個「完整性檢測函數」用於判斷相關的代碼是否被修改過。當然,基於同樣的原因,「完整性檢測函數」也必須與程序其他部分存在「強耦合」關系。
強耦合關系通過以下方式建立:
在程序其他部分的函數(例如函數A)中隨機的訪問需要強耦合的「序列號合法性檢測函數」和「完整性檢測函數」,在調用時隨機的選擇使用一個錯誤的序列號或是用戶輸入的序列號,並根據返回結果選擇執行A中正常的功能代碼還是錯誤退出的功能代碼,流程如圖4所示。

經過這種改進,如果破解者通過修改代碼的方式破解將因「完整性檢測」失敗導致程序退出;如果使用SMC等技術繞過「序列號合法性判斷函數」而直接跳至序列號正確時的執行入口,在後續的運行中,將因為隨機的耦合調用失敗導致程序退出。破解者要破解軟體將不得不跟蹤所有進行了耦合調用的函數,這顯然是一個艱巨的任務。
4、完整性檢測函數的設計
我們使用CRC演算法算出需進行完整性檢測的文件的校驗碼,並用RSA加密演算法的公鑰(不同於序列號合法性檢測中的公鑰/私鑰對)將其加密存放在特定的文件中,在檢測時先用CRC演算法重新生成需進行完
整性檢測的文件的校驗碼,並用私鑰將保存的校驗碼解密,兩者相比較,相等則正常運行;否則退出。
5、程序載入器的設計
與編譯成機器碼執行的程序不同,Java程序只能由Java虛擬機解釋執行,因此程序載入器的工作包括:初始化Java虛擬機;在內存中解密當前要運行的class文件;使解密後的c:lass文件在虛擬機中運行,在
需要時解密另一個class文件。圖5是用於初始化JVM的代碼:

以上介紹了我們設計的針對Java軟體的加密保護方法,其中綜合運用了多種加密技術,抗破解強度高;使用純軟體保護技術,成本低。經筆者在Windows系列平台上進行測試,運行穩定,效果良好。
在研宄開發過程中,我們還總結出加密保護軟體的一些經驗:
1、對關鍵代碼和數據要靜態加密,再動態解密執行;要結合具體的工作平台使用反跟蹤/調試技術;
2、要充分利用系統的功能,如在Windows下使用DLL文件或驅動程序形式能得到最大的豐又限,可以充分利用系統具有的各種功能;
3、如果可能應該將關鍵代碼存放在不可禚復制的地方;
4、序列號要與機器碼等用戶信息相關以阻止鹽復布序列號;
5、加密流程的合理性比加密演算法本身的強度更重要。

㈡ java編程中,Socket通信是怎麼實現的

java編程對於Socket之間的通信過程如下:

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客戶端代碼
Java代碼publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}

}

㈢ JAVA服務端android客戶端如何通信

從伺服器寫一個字元串過去可以這樣:String p = "-1,2,5";
發過去以後,將字元串分隔開,String[] ss = p.split(",");
數組裡面的元素就是位置的三個坐標了。
但鑒於你可能發送多種類型的數據,你可以寫一個協議,舉例說就是,String p ="P,-1,2,5";
分隔出來以後,可以根據數組裡面的第一個值判斷是什麼類型的數據,在執行相關的操作。

閱讀全文

與java通訊機相關的資料

熱點內容
泰國女的販毒電影 瀏覽:834
小電影地址誰有啊 瀏覽:788
開利活塞製冷壓縮機 瀏覽:97
把應用加密的秘密改了 瀏覽:760
姜恩惠治療姐夫 瀏覽:60
android耳機驅動 瀏覽:80
學生事務安卓解壓碼 瀏覽:176
肉文快穿女主 瀏覽:251
數字加密藝術什麼意思 瀏覽:695
android判斷語言 瀏覽:51
加密區離支座距離 瀏覽:47
labview寶典pdf 瀏覽:165
歐美電影 ,一個女的和男性做完愛就殺死男性 瀏覽:499
有部電影小孩叫波仔周冬雨 瀏覽:290
一個國外的電影,一個男孩與阿姨家裡的女傭偷吃 瀏覽:863
自動化plc怎麼編程 瀏覽:943
程序員團體怎麼樣 瀏覽:740
中國免費電影網站大全 瀏覽:342
昨天晚上我在看電影。英文翻譯 瀏覽:505
android廣告循環 瀏覽:215