㈠ java 的3DES加密演算法代碼 誰有啊 需要CBC模式的
在Java中實現3DES加密演算法時,首先需要生成密鑰。生成密鑰的方法如下:
java
public void SkeyDES(){
try {
//使用DESede演算法獲得密鑰生成器
KeyGenerator generator=KeyGenerator.getInstance("DESede");
//初始化密鑰生成器,設置密鑰的長度為168個長度
generator.init(168);
SecretKey key=generator.generateKey();
//以序列化的方式保存密鑰
FileOutputStream fos=new FileOutputStream("key.dat");
ObjectOutputStream outputStream=new ObjectOutputStream(fos);
outputStream.writeObject(key);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
接下來是CBC模式下的加密方法:
java
public byte[] SEncCBC(String s) throws Exception{
//從文件key.dat中讀取密鑰
FileInputStream in=new FileInputStream("key.dat");
ObjectInputStream obinput=new ObjectInputStream(in);
Key key=(Key)obinput.readObject();
obinput.close();
//生成初始向量
byte[] ints=new byte[8];
SecureRandom r=new SecureRandom(ints);
//使用DESede/CBC/PKCS5Padding模式的Cipher實例
Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key,r);
byte[] b=s.getBytes("utf-8");
byte[] byteencrypt=cipher.doFinal(b);
//將初始向量和加密後的數據寫入文件
FileOutputStream out=new FileOutputStream("SENcCBC.dat");
out.write(ints);
out.write(byteencrypt);
out.close();
return byteencrypt;
}
在加密過程中,初始向量(IV)對於加密的正確性至關重要。它不僅影響加密結果,而且對於相同的明文和密鑰,不同的IV會產生不同的密文,從而增強加密的安全性。
在進行3DES加密時,使用CBC模式可以確保數據的機密性和完整性。通過將初始向量與密鑰一起使用,可以防止某些常見的加密攻擊,如明文分塊攻擊。
值得注意的是,在實際應用中,應確保密鑰和IV的安全存儲和傳輸。此外,對於長文本的加密,建議使用分段加密,並在加密後的數據中添加必要的標記,以便於解密過程中的正確處理。
在使用上述代碼時,請確保您的環境支持DESede演算法,並且已經導入了必要的包,如`javax.crypto`和`java.io`。
以上代碼示例提供了一個基本的3DES加密實現,適用於需要使用CBC模式進行加密的應用場景。
㈡ DESede加解密-Java
三重數據加密演算法(TDEA,Triple Data Encryption Algorithm)即3DES,是使用三次DES加密演算法對數據塊進行加密。其原理旨在通過增加DES的密鑰長度來提高安全性,避免暴力破解。3DES使用3條56位的密鑰對數據進行三次加密,相比原版DES,更為安全。加密過程為:C=Ek3(Dk2(Ek1(P))),解密過程為:P=Dk1(EK2(Dk3(C)))。3DES演算法使用雙長度(16位元組)密鑰K=(KL||KR)對8位元組明文數據塊進行三次DES加密或解密。SessionKey的計算採用3DES演算法,計算出單倍長度的密鑰。
Java中實現3DES加密解密的代碼示例如下:
java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
public class TripleDES {
public static final String ALGORITHM = "DESede/CBC/PKCS5Padding";
public static Key generateKey(byte[] key) throws Exception {
return new SecretKeySpec(key, ALGORITHM);
}
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] encryptedData, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
return cipher.doFinal(encryptedData);
}
}
以上代碼定義了一個TripleDES類,包含用於生成密鑰、加密和解密數據的方法。使用此代碼,您可以輕松地將數據加密和解密過程集成到Java應用中。
請注意,雖然3DES在當時提供了一定的安全性提升,但它現在已經不再被認為是安全的,特別是在面對現代計算能力時。因此,推薦使用更現代的加密演算法,如AES,以確保數據安全。
㈢ 如何用JAVA實現字元串簡單加密解密
Java中可以使用多種加密演算法來加密字元串,例如DES演算法。下面通過一個示例來展示如何使用Java實現字元串的加密和解密。
首先,我們需要創建一個密鑰。這可以通過調用`KeyGenerator`類的`getInstance`方法來實現。這里我們以DES演算法為例:
KeyGenerator keygen = KeyGenerator.getInstance("DES");
接下來,我們需要初始化`KeyGenerator`對象,並生成一個密鑰:
keygen.init(512);
使用生成的密鑰進行加密操作。這里我們定義一個方法`encryptToDES`,接受一個密鑰和要加密的信息,返回加密後的信息:
public String encryptToDES(SecretKey key, String info) { ... }
解密操作則通過另一個方法`decryptByDES`來實現,該方法接受密鑰和要解密的密文,返回解密後的信息:
public String decryptByDES(SecretKey key, String sInfo) { ... }
此外,還可以使用其他加密演算法,如MD5和SHA-1。這里提供一個MD5加密方法`encryptToMD5`:
public String encryptToMD5(String info) { ... }
以及一個SHA-1加密方法`encryptToSHA`:
public String encryptToSHA(String info) { ... }
通過這些方法,我們可以方便地對字元串進行加密和解密操作。同時,還可以使用公鑰和私鑰進行數字簽名和驗證,確保信息的完整性和安全性。
示例代碼中還包含了一些輔助方法,如將二進制轉化為16進制字元串`byte2hex`,以及將十六進制字元串轉化為二進制`hex2byte`。這些方法在加密和解密過程中起到了關鍵作用。
通過上述方法,我們可以靈活地在Java中實現字元串的加密和解密,確保數據的安全傳輸和存儲。
㈣ 如何用Java進行3DES加密解密
3DES加密解密的核心在於其演算法設計。3DES即Triple DES,是一種基於DES演算法的加密方法。其主要特點是使用三個不同的密鑰,通過三次DES加密過程實現更高的安全性。
在Java中,3DES加密解密的實現步驟如下:
1. 首先定義加密演算法為"DESede"。
2. 使用SecretKeySpec生成密鑰,密鑰長度為24位元組。
3. 創建Cipher實例,並初始化為加密或解密模式。
4. 使用doFinal方法進行加密或解密操作。
下面是一個具體的3DES加密解密Java代碼示例:
java
package com.nnff.des;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class ThreeDes {
private static final String Algorithm = "DESede";
public static byte[] encryptMode(byte[] keybyte, byte[] src) {
try {
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] decryptMode(byte[] keybyte, byte[] src) {
try {
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String byte2Hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
public static void main(String[] args) {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, (byte) 0xE2};
String szSrc = "This is a 3DES test. 測試";
System.out.println("加密前的字元串:" + szSrc);
byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());
System.out.println("加密後的字元串:" + new String(encoded));
byte[] srcBytes = decryptMode(keyBytes, encoded);
System.out.println("解密後的字元串:" + (new String(srcBytes)));
}
}
在這個示例中,我們使用了一個24位元組的密鑰進行加密和解密操作。
通過上述代碼,我們可以實現3DES加密和解密功能。
㈤ java des加密,密鑰的長度是多少
3des演算法是指使用雙長度(16位元組)密鑰k=(kl||kr)將8位元組明文數據塊進行3次des加密/解密。如下所示:
y
=
des(kl)[des-1(kr)[des(kl[x])]]
解密方式為:
x
=
des-1
(kl)[des
(kr)[
des-1
(kl[y])]]
其中,des(kl[x])表示用密鑰k對數據x進行des加密,des-1
(kl[y])表示用密鑰k對數據y進行解密。
sessionkey的計算採用3des演算法,計算出單倍長度的密鑰。表示法為:sk
=
session(dk,data)
3des加密演算法為:
void
3des(byte
doublekeystr[16],
byte
data[8],
byte
out[8])
{
byte
buf1[8],
buf2[8];
des
(&doublekeystr[0],
data,
buf1);
udes(&doublekeystr[8],
buf1,
buf2);
des
(&doublekeystr[0],
buf2,
out);
}
㈥ DES加密演算法 java實現
c語言的源代碼,供參考:
http://hi..com/gaojinshan/blog/item/8b2710c4ece4b3ce39db49e9.html
㈦ java環境下實現idea演算法的加密解密
基於Java的IDEA加密演算法探討
隨著Internet的迅速發展,電子商務的浪潮勢不可擋,日常工作和數據傳輸都放在Internet網上進行傳輸,大大提高了效率,降低了成本,創造了良好的效益。但是,由於 Internet網路協議本身存在著重要的安全問題(IP包本身並不繼承任何安全特性,很容易偽造出IP包的地址、修改其內容、重播以前的包以及在傳輸途中攔截並查看包的內容),使網上的信息傳輸存在巨大的安全風險電子商務的安全問題也越來越突出。加密是電子商務中最主要的安全技術,加密方法的選取直接影響電子商務活動中信息的安全程度,在電子商務系統中,主要的安全問題都可以通過加密來解決。數據的保密性可通過不同的加密演算法對數據加密來實現。
對我國來講,雖然可以引進很多的外國設備,但加密設備不能依靠引進,因為它涉及到網路安全、國家機密信息的安全,所以必須自己研製。當前國際上有許多加密演算法,其中DES(Data Encryption Standard)是發明最早的用得最廣泛的分組對稱加密演算法,DES用56位蜜鑰加密64位明文,輸出64位密文,DES的56位密鑰共有256 種可能的密鑰,但歷史上曾利用窮舉攻擊破解過DES密鑰,1998年電子邊境基金會(EFF)用25萬美元製造的專用計算機,用56小時破解了DES的密鑰,1999年,EFF用22小時完成了破解工作,使DES演算法受到了嚴重打擊,使它的安全性受到嚴重威脅。因為JAVA語言的安全性和網路處理能力較強,本文主要介紹使用IDEA(Internation Data Encryption Algorithm )數據加密演算法在Java環境下實現數據的安全傳輸。
一、IDEA數據加密演算法
IDEA數據加密演算法是由中國學者來學嘉博士和著名的密碼專家 James L. Massey 於1990年聯合提出的。它的明文和密文都是64比特,但密鑰長為128比特。IDEA 是作為迭代的分組密碼實現的,使用 128 位的密鑰和 8 個循環。這比 DES 提供了更多的 安全性,但是在選擇用於 IDEA 的密鑰時,應該排除那些稱為「弱密鑰」的密鑰。DES 只有四個弱密鑰和 12 個次弱密鑰,而 IDEA 中的弱密鑰數相當可觀,有 2 的 51 次方個。但是,如果密鑰的總數非常大,達到 2 的 128 次方個,那麼仍有 2 的 77 次方個密鑰可供選擇。IDEA 被認為是極為安全的。使用 128 位的密鑰,蠻力攻擊中需要進行的測試次數與 DES 相比會明顯增大,甚至允許對弱密鑰測試。而且,它本身也顯示了它尤其能抵抗專業形式的分析性攻擊。
二、Java密碼體系和Java密碼擴展
Java是Sun公司開發的一種面向對象的編程語言,並且由於它的平台無關性被大量應用於Internet的開發。Java密碼體系(JCA)和Java密碼擴展(JCE)的設計目的是為Java提供與實現無關的加密函數API。它們都用factory方法來創建類的常式,然後把實際的加密函數委託給提供者指定的底層引擎,引擎中為類提供了服務提供者介面在Java中實現數據的加密/解密,是使用其內置的JCE(Java加密擴展)來實現的。Java開發工具集1.1為實現包括數字簽名和信息摘要在內的加密功能,推出了一種基於供應商的新型靈活應用編程介面。Java密碼體系結構支持供應商的互操作,同時支持硬體和軟體實現。Java密碼學結構設計遵循兩個原則:(1)演算法的獨立性和可靠性。(2)實現的獨立性和相互作用性。演算法的獨立性是通過定義密碼服務類來獲得。用戶只需了解密碼演算法的概念,而不用去關心如何實現這些概念。實現的獨立性和相互作用性通過密碼服務提供器來實現。密碼服務提供器是實現一個或多個密碼服務的一個或多個程序包。軟體開發商根據一定介面,將各種演算法實現後,打包成一個提供器,用戶可以安裝不同的提供器。安裝和配置提供器,可將包含提供器的ZIP和JAR文件放在CLASSPATH下,再編輯Java安全屬性文件來設置定義一個提供器。Java運行環境Sun版本時,提供一個預設的提供器Sun。
三、Java環境下的實現
1.加密過程的實現
void idea_enc( int data11[], /*待加密的64位數據首地址*/ int key1[]){
int i ;
int tmp,x;
int zz[]=new int[6];
for ( i = 0 ; i < 48 ; i += 6) { /*進行8輪循環*/
for(int j=0,box=i; j<6; j++,box++){
zz[j]=key1[box];
}
x = handle_data(data11,zz);
tmp = data11[1]; /*交換中間兩個*/
data11[1] = data11[2];
data11[2] = tmp;
}
tmp = data11[1]; /*最後一輪不交換*/
data11[1] = data11[2];
data11[2] = tmp;
data11[0] = MUL(data11[0],key1[48]);
data11[1] =(char)((data11[1] + key1[49])%0x10000);
data11[2] =(char)((data11[2] + key1[50])%0x10000);
data11[3] = MUL(data11[3],key1[51]);
}
2.解密過程的實現
void key_decryExp(int outkey[])/*解密密鑰的變逆處理*/
{ int tmpkey[] = new int[52] ;
int i;
for ( i = 0 ; i < 52 ; i++) {
tmpkey[i] = outkey[ wz_spkey[i] ] ; /*換位*/
}
for ( i = 0 ; i < 52 ; i++) {
outkey[i] = tmpkey[i];
}
for ( i = 0 ; i < 18 ; i++) {
outkey[wz_spaddrever[i]] = (char)(65536-outkey[wz_spaddrever[i]]) ; /*替換成加法逆*/
}
for ( i = 0 ; i < 18 ; i++){
outkey[wz_spmulrevr[i]] =(char)(mulInv(outkey[wz_spmulrevr[i]] )); /*替換成乘法逆*/
}
}
四、總結
在實際應用中,我們可以使用Java開發工具包(JDK)中內置的對Socket通信的支持,通過JCE中的Java流和鏈表,加密基於Socket的網路通信.我們知道,加密/解密是數據傳輸中保證數據完整性的常用方法,Java語言因其平台無關性,在Internet上的應用非常之廣泛.使用Java實現基於IDEA的數據加密傳輸可以在不同的平台上實現並具有實現簡潔、安全性強等優點。