真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java實(shí)時(shí)消息加密代碼 java通信加密

如何用java語言對(duì)即時(shí)通訊軟件進(jìn)行加密

一、Java軟件加密基本思路

十余年的石家莊網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整石家莊建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“石家莊網(wǎng)站設(shè)計(jì)”,“石家莊網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

對(duì)于應(yīng)用軟件的保護(hù)筆者從兩個(gè)方面進(jìn)行考慮,第一是阻止盜版使用軟件,第二是阻止競(jìng)爭對(duì)手對(duì)軟件反編譯,即阻止對(duì)軟件的逆向工程。

1、阻止盜版

在軟件運(yùn)行時(shí)對(duì)自身存在的合法性進(jìn)行判斷,如果認(rèn)為自身的存在和運(yùn)行是被授權(quán)的、合法的,就運(yùn)行;否則終止運(yùn)行。這樣即使軟件可以被隨意復(fù)制,只要盜版用戶沒有相應(yīng)的授權(quán)信息就無法使用軟件。

2、阻止反編譯

對(duì)編譯產(chǎn)生的Class文件加密處理,并在運(yùn)行時(shí)進(jìn)行解密,解密者無法對(duì)軟件進(jìn)行反編譯。

二、Java軟件加密的總體流程

為了保護(hù)用Java語言開發(fā)的軟件,我們?cè)O(shè)計(jì)并實(shí)現(xiàn)了一個(gè)實(shí)用、高強(qiáng)度的加密算法。以下稱需要保護(hù)的Java軟件為“受保護(hù)程序”,稱對(duì)“受保護(hù)程序”進(jìn)行加密保護(hù)的軟件為“加密程序”。對(duì)軟件加密保護(hù)的流程如圖1所示。

三、加密算法分析設(shè)計(jì)

1、用戶信息提取器設(shè)計(jì)

為了防止用戶發(fā)布序列號(hào)而導(dǎo)致“一次發(fā)行,到處都是”的盜版問題,提取用戶機(jī)器中硬件相關(guān)的、具有唯一性的信息——用戶計(jì)算機(jī)的硬盤分區(qū)C的序列號(hào),并要求用戶將此信息與用戶名一起返回,之后用“序列號(hào)生成器”根據(jù)用戶返回信息生成一個(gè)唯一合法的軟件注冊(cè)序列號(hào)發(fā)回用戶,用戶即可使用此號(hào)碼注冊(cè)使用軟件。

這個(gè)信息提取器使用Winclows 32匯編以一個(gè)獨(dú)立的小程序方式實(shí)現(xiàn),程序代碼如圖2所示。

2、序列號(hào)生成器與序列號(hào)合法性判斷函數(shù)的設(shè)計(jì)

序列號(hào)生成器與序列號(hào)合法性判斷函數(shù)中運(yùn)用RSA加密算法。在序列號(hào)生成器中是使用私鑰將用戶返回的信息(硬盤序列號(hào),用戶名)進(jìn)行加密得到相應(yīng)的注冊(cè)序列號(hào);在序列號(hào)合法性判斷函數(shù)中使用私鑰將用戶輸入的注冊(cè)序列號(hào)解密,再與(硬盤序列號(hào),用戶名)進(jìn)行比較,一致則調(diào)用程序裝載器將程序其他部分解密裝入內(nèi)存,初始化刪環(huán)境并運(yùn)行程序主體;否則退出。

RSA加密算法的實(shí)現(xiàn)需要使用大數(shù)運(yùn)算庫,我們使用MIRACL大數(shù)庫來實(shí)現(xiàn)RSA計(jì)算,序列號(hào)生成器的主要代碼如下:

char szlnputString[]=”機(jī)器碼和用戶名組成的字符串”;

char szSerial[256]=[0];//用于存放生成的注冊(cè)碼

bign,d,c,m; //MIRACL中的大數(shù)類型

mip→IBASE=16; //以16進(jìn)制模式

n= mlrvar(0); //初始化大數(shù)

d= mirvar(0);

c= mirvar(0); //C存放輸入的字符串大數(shù)

m= mlrva(o);

bytes to big( len, szlnputString,c);

//將輸入字符串轉(zhuǎn)換成大數(shù)形式并存入變量c中

cinstr(n,”以字符串形成表示的模數(shù)”);//初始化模數(shù)

cinstr(d,”以字符串形成表示的公鑰”)://初始化公鑰

powmod(c,d,n,m); //計(jì)算m=cdmod n

cotstr(m,szSerial);//m的16進(jìn)制字符串即為注冊(cè)碼

序列號(hào)合法性檢測(cè)函數(shù)的主要代碼如下:

char szlnputStringL]=”機(jī)器碼和用戶名組成的字符串”;

char szSerial[ 256]=”用戶輸入的序列號(hào)”

bign,e,c,m; //MIRACL中的大數(shù)類型

mip→IBASE=16; //以16進(jìn)制模式

cinstr(m,szSerial); //將序列號(hào)的16進(jìn)制轉(zhuǎn)成大數(shù)形式

cinstr(n,”模數(shù)n的字符串形式”);//初始化模數(shù)n

cinstr(e,”字符串形式的公鑰”);//初始化公鑰

if compare(m,n)==-1) //mn時(shí)才進(jìn)行解密

{

powmod(m,e,n,c);//計(jì)算m=me mod n

big_to _bytes(0,c,szSerial,0); //轉(zhuǎn)為字符串

return lstrcmp( szlnputString,szSerial);

}

3、強(qiáng)耦合關(guān)系的設(shè)計(jì)

如果在序列號(hào)合法性檢測(cè)函數(shù)中簡單地使用圖3所示流程:

解密者可以使用以下幾種手段進(jìn)行攻擊:

(1)修改“判斷合法性子函數(shù)”的返回指令,讓它永遠(yuǎn)返回正確值,這樣可以使用任意的序列號(hào),安裝/使用軟件。

(2)修改判斷后的跳轉(zhuǎn)指令,使程序永遠(yuǎn)跳到正確的分支運(yùn)行,效果和上一種一樣。

(3)在“判斷合法性子函數(shù)”之前執(zhí)行一條跳轉(zhuǎn)指令,繞過判斷,直接跳轉(zhuǎn)到“正常執(zhí)行”分支運(yùn)行,這樣可以不用輸入序列號(hào)安裝/使用軟件。

為阻止以上攻擊手段,筆者在程序中增加了“序列號(hào)合法性檢測(cè)函數(shù)”與程序其他部分“強(qiáng)耦合”(即增強(qiáng)其與程序其他部分的關(guān)聯(lián)度,成為程序整體密不可分的一部分,一旦被修改程序?qū)o法正常工作)的要求(見圖1),并且設(shè)置一個(gè)“完整性檢測(cè)函數(shù)”用于判斷相關(guān)的代碼是否被修改過。當(dāng)然,基于同樣的原因,“完整性檢測(cè)函數(shù)”也必須與程序其他部分存在“強(qiáng)耦合”關(guān)系。

強(qiáng)耦合關(guān)系通過以下方式建立:

在程序其他部分的函數(shù)(例如函數(shù)A)中隨機(jī)的訪問需要強(qiáng)耦合的“序列號(hào)合法性檢測(cè)函數(shù)”和“完整性檢測(cè)函數(shù)”,在調(diào)用時(shí)隨機(jī)的選擇使用一個(gè)錯(cuò)誤的序列號(hào)或是用戶輸入的序列號(hào),并根據(jù)返回結(jié)果選擇執(zhí)行A中正常的功能代碼還是錯(cuò)誤退出的功能代碼,流程如圖4所示。

經(jīng)過這種改進(jìn),如果破解者通過修改代碼的方式破解將因“完整性檢測(cè)”失敗導(dǎo)致程序退出;如果使用SMC等技術(shù)繞過“序列號(hào)合法性判斷函數(shù)”而直接跳至序列號(hào)正確時(shí)的執(zhí)行入口,在后續(xù)的運(yùn)行中,將因?yàn)殡S機(jī)的耦合調(diào)用失敗導(dǎo)致程序退出。破解者要破解軟件將不得不跟蹤所有進(jìn)行了耦合調(diào)用的函數(shù),這顯然是一個(gè)艱巨的任務(wù)。

4、完整性檢測(cè)函數(shù)的設(shè)計(jì)

我們使用CRC算法算出需進(jìn)行完整性檢測(cè)的文件的校驗(yàn)碼,并用RSA加密算法的公鑰(不同于序列號(hào)合法性檢測(cè)中的公鑰/私鑰對(duì))將其加密存放在特定的文件中,在檢測(cè)時(shí)先用CRC算法重新生成需進(jìn)行完

整性檢測(cè)的文件的校驗(yàn)碼,并用私鑰將保存的校驗(yàn)碼解密,兩者相比較,相等則正常運(yùn)行;否則退出。

5、程序加載器的設(shè)計(jì)

與編譯成機(jī)器碼執(zhí)行的程序不同,Java程序只能由Java虛擬機(jī)解釋執(zhí)行,因此程序加載器的工作包括:初始化Java虛擬機(jī);在內(nèi)存中解密當(dāng)前要運(yùn)行的class文件;使解密后的c:lass文件在虛擬機(jī)中運(yùn)行,在

需要時(shí)解密另一個(gè)class文件。圖5是用于初始化JVM的代碼:

以上介紹了我們?cè)O(shè)計(jì)的針對(duì)Java軟件的加密保護(hù)方法,其中綜合運(yùn)用了多種加密技術(shù),抗破解強(qiáng)度高;使用純軟件保護(hù)技術(shù),成本低。經(jīng)筆者在Windows系列平臺(tái)上進(jìn)行測(cè)試,運(yùn)行穩(wěn)定,效果良好。

在研宄開發(fā)過程中,我們還總結(jié)出加密保護(hù)軟件的一些經(jīng)驗(yàn):

1、對(duì)關(guān)鍵代碼和數(shù)據(jù)要靜態(tài)加密,再動(dòng)態(tài)解密執(zhí)行;要結(jié)合具體的工作平臺(tái)使用反跟蹤/調(diào)試技術(shù);

2、要充分利用系統(tǒng)的功能,如在Windows下使用DLL文件或驅(qū)動(dòng)程序形式能得到最大的豐又限,可以充分利用系統(tǒng)具有的各種功能;

3、如果可能應(yīng)該將關(guān)鍵代碼存放在不可禚復(fù)制的地方;

4、序列號(hào)要與機(jī)器碼等用戶信息相關(guān)以阻止鹽復(fù)布序列號(hào);

5、加密流程的合理性比加密算法本身的強(qiáng)度更重要。

java加密解密代碼

package com.cube.limail.util;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;/**

* 加密解密類

*/

public class Eryptogram

{

private static String Algorithm ="DES";

private String key="CB7A92E3D3491964";

//定義 加密算法,可用 DES,DESede,Blowfish

static boolean debug = false ;

/**

* 構(gòu)造子注解.

*/

public Eryptogram ()

{

} /**

* 生成密鑰

* @return byte[] 返回生成的密鑰

* @throws exception 扔出異常.

*/

public static byte [] getSecretKey () throws Exception

{

KeyGenerator keygen = KeyGenerator.getInstance (Algorithm );

SecretKey deskey = keygen.generateKey ();

System.out.println ("生成密鑰:"+bytesToHexString (deskey.getEncoded ()));

if (debug ) System.out.println ("生成密鑰:"+bytesToHexString (deskey.getEncoded ()));

return deskey.getEncoded ();

} /**

* 將指定的數(shù)據(jù)根據(jù)提供的密鑰進(jìn)行加密

* @param input 需要加密的數(shù)據(jù)

* @param key 密鑰

* @return byte[] 加密后的數(shù)據(jù)

* @throws Exception

*/

public static byte [] encryptData (byte [] input ,byte [] key ) throws Exception

{

SecretKey deskey = new javax.crypto.spec.SecretKeySpec (key ,Algorithm );

if (debug )

{

System.out.println ("加密前的二進(jìn)串:"+byte2hex (input ));

System.out.println ("加密前的字符串:"+new String (input ));

} Cipher c1 = Cipher.getInstance (Algorithm );

c1.init (Cipher.ENCRYPT_MODE ,deskey );

byte [] cipherByte =c1.doFinal (input );

if (debug ) System.out.println ("加密后的二進(jìn)串:"+byte2hex (cipherByte ));

return cipherByte ;

} /**

* 將給定的已加密的數(shù)據(jù)通過指定的密鑰進(jìn)行解密

* @param input 待解密的數(shù)據(jù)

* @param key 密鑰

* @return byte[] 解密后的數(shù)據(jù)

* @throws Exception

*/

public static byte [] decryptData (byte [] input ,byte [] key ) throws Exception

{

SecretKey deskey = new javax.crypto.spec.SecretKeySpec (key ,Algorithm );

if (debug ) System.out.println ("解密前的信息:"+byte2hex (input ));

Cipher c1 = Cipher.getInstance (Algorithm );

c1.init (Cipher.DECRYPT_MODE ,deskey );

byte [] clearByte =c1.doFinal (input );

if (debug )

{

System.out.println ("解密后的二進(jìn)串:"+byte2hex (clearByte ));

System.out.println ("解密后的字符串:"+(new String (clearByte )));

} return clearByte ;

} /**

* 字節(jié)碼轉(zhuǎn)換成16進(jìn)制字符串

* @param byte[] b 輸入要轉(zhuǎn)換的字節(jié)碼

* @return String 返回轉(zhuǎn)換后的16進(jìn)制字符串

*/

public static String byte2hex (byte [] b )

{

String hs ="";

String stmp ="";

for (int n =0 ;n b.length ;n ++)

{

stmp =(java.lang.Integer.toHexString (b [n ] 0XFF ));

if (stmp.length ()==1 ) hs =hs +"0"+stmp ;

else hs =hs +stmp ;

if (n b.length -1 ) hs =hs +":";

} return hs.toUpperCase ();

}

/**

* 字符串轉(zhuǎn)成字節(jié)數(shù)組.

* @param hex 要轉(zhuǎn)化的字符串.

* @return byte[] 返回轉(zhuǎn)化后的字符串.

*/

public static byte[] hexStringToByte(String hex) {

int len = (hex.length() / 2);

byte[] result = new byte[len];

char[] achar = hex.toCharArray();

for (int i = 0; i len; i++) {

int pos = i * 2;

result[i] = (byte) (toByte(achar[pos]) 4 | toByte(achar[pos + 1]));

}

return result;

}

private static byte toByte(char c) {

byte b = (byte) "0123456789ABCDEF".indexOf(c);

return b;

}

/**

* 字節(jié)數(shù)組轉(zhuǎn)成字符串.

* @param String 要轉(zhuǎn)化的字符串.

* @return 返回轉(zhuǎn)化后的字節(jié)數(shù)組.

*/

public static final String bytesToHexString(byte[] bArray) {

StringBuffer sb = new StringBuffer(bArray.length);

String sTemp;

for (int i = 0; i bArray.length; i++) {

sTemp = Integer.toHexString(0xFF bArray[i]);

if (sTemp.length() 2)

sb.append(0);

sb.append(sTemp.toUpperCase());

}

return sb.toString();

}

/**

* 從數(shù)據(jù)庫中獲取密鑰.

* @param deptid 企業(yè)id.

* @return 要返回的字節(jié)數(shù)組.

* @throws Exception 可能拋出的異常.

*/

public static byte[] getSecretKey(long deptid) throws Exception {

byte[] key=null;

String value=null;

//CommDao dao=new CommDao();

// List list=dao.getRecordList("from Key k where k.deptid="+deptid);

//if(list.size()0){

//value=((com.csc.sale.bean.Key)list.get(0)).getKey();

value = "CB7A92E3D3491964";

key=hexStringToByte(value);

//}

if (debug)

System.out.println("密鑰:" + value);

return key;

}

public String encryptData2(String data) {

String en = null;

try {

byte[] key=hexStringToByte(this.key);

en = bytesToHexString(encryptData(data.getBytes(),key));

} catch (Exception e) {

e.printStackTrace();

}

return en;

}

public String decryptData2(String data) {

String de = null;

try {

byte[] key=hexStringToByte(this.key);

de = new String(decryptData(hexStringToByte(data),key));

} catch (Exception e) {

e.printStackTrace();

}

return de;

}

} 加密使用: byte[] key=Eryptogram.getSecretKey(deptid); //獲得鑰匙(字節(jié)數(shù)組)

byte[] tmp=Eryptogram.encryptData(password.getBytes(), key); //傳入密碼和鑰匙,獲得加密后的字節(jié)數(shù)組的密碼

password=Eryptogram.bytesToHexString(tmp); //將字節(jié)數(shù)組轉(zhuǎn)化為字符串,獲得加密后的字符串密碼解密與之差不多

求java加密源代碼(MD5,base64)

import java.security.*;

import javax.crypto.*;

/**

* 本例解釋如何利用DES私鑰加密算法加解密

*

* @author Devon

* @version 1.0 04/03/10

*/

public class SingleKeyExample {

public static void main(String[] args) {

try {

String algorithm = "DES"; //定義加密算法,可用 DES,DESede,Blowfish

String message = "Hello World. 這是待加密的信息";

// 生成個(gè)DES密鑰

KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);

keyGenerator.init(56); //選擇DES算法,密鑰長度必須為56位

Key key = keyGenerator.generateKey(); //生成密鑰

// 生成Cipher對(duì)象

Cipher cipher = Cipher.getInstance("DES");

//用密鑰加密明文(message),生成密文(cipherText)

cipher.init(Cipher.ENCRYPT_MODE, key); //操作模式為加密(Cipher.ENCRYPT_MODE),key為密鑰

byte[] cipherText = cipher.doFinal(message.getBytes()); //得到加密后的字節(jié)數(shù)組

System.out.println("加密后的信息: " + new String(cipherText));

//用密鑰加密明文(plainText),生成密文(cipherByte)

cipher.init(Cipher.DECRYPT_MODE, key); //操作模式為解密,key為密鑰

byte[] sourceText = cipher.doFinal(cipherText); //獲得解密后字節(jié)數(shù)組

System.out.println("解密后的信息: " + new String(sourceText));

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

/**

* @author Devon

*/

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

public class PairKeyExample {

public static void main(String argv[]) {

try {

String algorithm = "RSA"; //定義加密算法,可用 DES,DESede,Blowfish

String message = "張三,你好,我是李四";

//產(chǎn)生張三的密鑰對(duì)(keyPairZhang)

KeyPairGenerator keyGeneratorZhang =

KeyPairGenerator.getInstance(algorithm); //指定采用的算法

keyGeneratorZhang.initialize(1024); //指定密鑰長度為1024位

KeyPair keyPairZhang = keyGeneratorZhang.generateKeyPair(); //產(chǎn)生密鑰對(duì)

System.out.println("生成張三的公鑰對(duì)");

// 張三生成公鑰(publicKeyZhang)并發(fā)送給李四,這里發(fā)送的是公鑰的數(shù)組字節(jié)

byte[] publicKeyZhangEncode = keyPairZhang.getPublic().getEncoded();

//通過網(wǎng)絡(luò)或磁盤等方式,把公鑰編碼傳送給李四

//李四接收到張三編碼后的公鑰,將其解碼

KeyFactory keyFacoryLi = KeyFactory.getInstance(algorithm); //得到KeyFactory對(duì)象

X509EncodedKeySpec x509KeySpec =

new X509EncodedKeySpec(publicKeyZhangEncode); //公鑰采用X.509編碼

PublicKey publicKeyZhang = keyFacoryLi.generatePublic(x509KeySpec); //將公鑰的KeySpec對(duì)象轉(zhuǎn)換為公鑰

System.out.println("李四成功解碼,得到張三的公鑰");

//李四用張三的公鑰加密信息,并發(fā)送給李四

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); //得到Cipher對(duì)象

cipher.init(Cipher.ENCRYPT_MODE, publicKeyZhang); //用張三的公鑰初始化Cipher對(duì)象

byte[] cipherMessage = cipher.doFinal(message.getBytes()); //得到加密信息

System.out.println("加密后信息:" + new String(cipherMessage));

System.out.println("加密完成,發(fā)送給李四...");

//張三用自己的私鑰解密從李四處收到的信息

cipher.init(Cipher.DECRYPT_MODE, keyPairZhang.getPrivate()); //張三用其私鑰初始化Cipher對(duì)象

byte[] originalMessage = cipher.doFinal(cipherMessage); //得到解密后信息

System.out.println("張三收到信息,解密后為:" + new String(originalMessage));

} catch (Exception ex) {

ex.printStackTrace();

}

}

}


文章名稱:java實(shí)時(shí)消息加密代碼 java通信加密
文章鏈接:http://weahome.cn/article/dopepsd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部