關於java的3des加密演算法實踐的信息

本文目錄一覽:

如何用Java進行3DES加密解密

這裡是例子,直接拿來用就可以了。

package com.nnff.des;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/*字元串 DESede(3DES) 加密

* ECB模式/使用PKCS7方式填充不足位,目前給的密鑰是192位

* 3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的

* 加密標準),是DES的一個更安全的變形。它以DES為基本模塊,通過組合分組方法設計出分組加

* 密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的

* 密鑰,P代表明文,C代表密表,這樣,

* 3DES加密過程為:C=Ek3(Dk2(Ek1(P)))

* 3DES解密過程為:P=Dk1((EK2(Dk3(C)))

* */

public class ThreeDes {

/**

* @param args在java中調用sun公司提供的3DES加密解密演算法時,需要使

* 用到$JAVA_HOME/jre/lib/目錄下如下的4個jar包:

*jce.jar

*security/US_export_policy.jar

*security/local_policy.jar

*ext/sunjce_provider.jar

*/

private static final String Algorithm = “DESede”; //定義加密演算法,可用 DES,DESede,Blowfish

//keybyte為加密密鑰,長度為24位元組

//src為被加密的數據緩衝區(源)

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 (java.security.NoSuchAlgorithmException e1) {

// TODO: handle exception

e1.printStackTrace();

}catch(javax.crypto.NoSuchPaddingException e2){

e2.printStackTrace();

}catch(java.lang.Exception e3){

e3.printStackTrace();

}

return null;

}

//keybyte為加密密鑰,長度為24位元組

//src為加密後的緩衝區

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 (java.security.NoSuchAlgorithmException e1) {

// TODO: handle exception

e1.printStackTrace();

}catch(javax.crypto.NoSuchPaddingException e2){

e2.printStackTrace();

}catch(java.lang.Exception e3){

e3.printStackTrace();

}

return null;

}

//轉換成十六進位字元串

public static String byte2Hex(byte[] b){

String hs=””;

String stmp=””;

for(int n=0; nb.length; n++){

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

if(stmp.length()==1){

hs = hs + “0” + stmp;

}else{

hs = hs + stmp;

}

if(nb.length-1)hs=hs+”:”;

}

return hs.toUpperCase();

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//添加新安全演算法,如果用JCE就要把它添加進去

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

}; //24位元組的密鑰

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)));

}

}

2.2 DES/3DES演算法 — 演算法介紹

DES 演算法和 DESSede 演算法統稱DES系列演算法,是對稱加密演算法領域的經典加密演算法。 DESSede (又稱 3DES )使用三次迭代增加演算法安全性。DES演算法是眾多對稱加密演算法的基礎,很多演算法都是基於該演算法演變而來。

雖然DES被取代了,但是DES的CBC工作模式是基礎性的演算法和工作模型,有很強的意義,在遺留系統中也有一些使用的。

DES的演算法是採用分組加密工作模式,流程比較複雜,大致流程如下:

DES 和 3DES 適合一般加密性場景,當前大部分是遺留系統在使用,還有一部分可能是系統沒有支持 AES 等其他加密手段被迫使用。

JDK僅支持 56位的密鑰長度 (出口限制),對稱加密系列演算法的特點是:密鑰長度越高安全性越高,因此JDK本身自帶的 DES 和 3DES 演算法僅適合學術和一般場景使用,Bouncy Castle提供了64位密鑰長度的支持。

3DES 是對 DES 的一種改良演算法,針對 DES 演算法密鑰短,迭代次數少的缺點做了改進。但是 3DES 演算法速度慢,密鑰計算時間長,加密效率不高,實際使用也不多。

DES 的 3 大安全痛點:

java 3des 密鑰是多少位

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); }

求java中3des加密解密示例

在java中調用sun公司提供的3DES加密解密演算法時,需要使用到$JAVA_HOME/jre/lib/目錄下如下的4個jar包:

jce.jar

security/US_export_policy.jar

security/local_policy.jar

ext/sunjce_provider.jar

Java運行時會自動載入這些包,因此對於帶main函數的應用程序不需要設置到CLASSPATH環境變數中。對於WEB應用,不需要把這些包加到WEB-INF/lib目錄下。

以下是java中調用sun公司提供的3DES加密解密演算法的樣本代碼:

加密解密代碼

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/*字元串 DESede(3DES) 加密*/

public class ThreeDes {

/**

* @param args在java中調用sun公司提供的3DES加密解密演算法時,需要使

* 用到$JAVA_HOME/jre/lib/目錄下如下的4個jar包:

*jce.jar

*security/US_export_policy.jar

*security/local_policy.jar

*ext/sunjce_provider.jar

*/

private static final String Algorithm =”DESede”; //定義加密演算法,可用 DES,DESede,Blowfish

//keybyte為加密密鑰,長度為24位元組

//src為被加密的數據緩衝區(源)

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 (java.security.NoSuchAlgorithmException e1) {

// TODO: handle exception

e1.printStackTrace();

}catch(javax.crypto.NoSuchPaddingException e2){

e2.printStackTrace();

}catch(java.lang.Exception e3){

e3.printStackTrace();

}

return null;

}

//keybyte為加密密鑰,長度為24位元組

//src為加密後的緩衝區

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 (java.security.NoSuchAlgorithmException e1) {

// TODO: handle exception

e1.printStackTrace();

}catch(javax.crypto.NoSuchPaddingException e2){

e2.printStackTrace();

}catch(java.lang.Exception e3){

e3.printStackTrace();

}

return null;

}

//轉換成十六進位字元串

public static String byte2Hex(byte[] b){

String hs=””;

String stmp=””;

for(int n=0; nb.length; n++){

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

if(stmp.length()==1){

hs = hs + “0” + stmp;

}else{

hs = hs + stmp;

}

if(nb.length-1)hs=hs+”:”;

}

return hs.toUpperCase();

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//添加新安全演算法,如果用JCE就要把它添加進去

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

}; //24位元組的密鑰

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)));

}

}

java 進行3DES 加密解密

【Java使用3DES加密解密的流程】

①傳入共同約定的密鑰(keyBytes)以及演算法(Algorithm),來構建SecretKey密鑰對象

SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);

②根據演算法實例化Cipher對象。它負責加密/解密

Cipher c1 = Cipher.getInstance(Algorithm);

③傳入加密/解密模式以及SecretKey密鑰對象,實例化Cipher對象

c1.init(Cipher.ENCRYPT_MODE, deskey);

④傳入位元組數組,調用Cipher.doFinal()方法,實現加密/解密,並返回一個byte位元組數組

c1.doFinal(src);

參考了:

如何用Java進行3DES加密解

public static String encryptKey(String mainKey,String plainKey){ String encryptKey = “”; try{ Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); String Algorithm = “DESede/ECB/NoPadding”; byte[] hb = hex2byte(mainKey.getBytes()); byte[] k = new byte[24]; System.arraycopy(hb,0,k,0,16); System.arraycopy(hb,0,k,16,8); SecretKey deskey = new SecretKeySpec(k, Algorithm); Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE, deskey); encryptKey = byte2hex(c1.doFinal(hex2byte(plainKey.getBytes()))); }catch(Exception e){ e.printStackTrace(); } return encryptKey; }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 += (“0” + stmp); else hs += stmp; } return hs.toUpperCase(); } 3DES的加密密鑰長度要求是24個位元組,本例中因為給定的密鑰只有16個位元組,所以需要填補至24個位元組。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/272071.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 00:08
下一篇 2024-12-17 00:08

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論