java中3des cbc,js與java通用的3DES(ECB,CBC)+Base64加密編碼,解碼解密

J

S端加密過程:

key的處理:

通過創建指定的key,key必須是16位/24位/32位其中一種,但是常用的3DES加密的key為24位,下面使用的就是24位,key的長度可以隨意指定,在轉換key時,如果key不足24位則余數補0(因為最小位數必須是0以上),如果key多余24位,則會截取前24位數,多余部分則舍棄掉。

3DES加密的模式配定,有兩種常見的加密方式:ECB和CBC模式

第一種:ECB(電子密本方式)其實非常簡單,就是將數據按照8個字節一段進行DES加密或解密得到一段8個字節的密文或者明文,最后一段不足8個字節,按照需求補足8個字節進行計算,之后按照順序將計算所得的數據連在一起即可,各段數據之間互不影響。

第二種:CBC(密文分組鏈接方式)有點麻煩,它的實現機制使加密的各段數據之間有了聯系。其實現的機理如下:

加密步驟如下:

(1)首先將數據按照8個字節一組進行分組得到D1D2......Dn(若數據不是8的整數倍,用指定的PADDING數據補位)

(2)第一組數據D1與初始化向量I異或后的結果進行DES加密得到第一組密文C1(初始化向量I為全零)

(3)第二組數據D2與第一組的加密結果C1異或以后的結果進行DES加密,得到第二組密文C2

(4)之后的數據以此類推,得到Cn

(5)按順序連為C1C2C3......Cn即為加密結果。

解密是加密的逆過程,步驟如下:

(1)首先將數據按照8個字節一組進行分組得到C1C2C3......Cn

(2)將第一組數據進行解密后與初始化向量I進行異或得到第一組明文D1(注意:一定是先解密再異或)

(3)將第二組數據C2進行解密后與第一組密文數據進行異或得到第二組數據D2

(4)之后依此類推,得到Dn

(5)按順序連為D1D2D3......Dn即為解密結果。

這里注意一點,解密的結果並不一定是我們原來的加密數據,可能還含有你補得位,一定要把補位去掉才是你的原來的數據。

以下是的JS端的Demo,通過3DES加密解密,Base64編碼解碼,需要引入JQuery框架和封裝好的3DES加密解密算法,編碼解碼js文件:crypto-js.js,jsencrypt.js 這三個文件末尾處有鏈接下載。

3DES加密解密與Base64編碼解碼處理數據

body {

margin: 100px;

}

p, button {

font-size: 30px;

}

.btn2 {

margin-left: 100px;

}

//秘鑰key

var key = "12345677654321";

//key不足24位自動以0(最小位數是0)補齊,如果多余24位,則截取前24位,后面多余則舍棄掉

var base64 = CryptoJS.enc.Utf8.parse(key)

//加密使用的是3DES中的ECB,解密對應的使用ECB

function encrypt() {

var text = document.getElementById("content").innerText;

var encrypt = CryptoJS.TripleDES.encrypt(text, base64, {

//iv: CryptoJS.enc.Utf8.parse('01234567'),//iv偏移量

//mode: CryptoJS.mode.CBC, //CBC模式

mode: CryptoJS.mode.ECB, //ECB模式

padding: CryptoJS.pad.Pkcs7//padding處理

}

);

var encryptData = encrypt.toString();//加密完成后,轉換成字符串

document.getElementById("encrypt").innerText=encryptData;

}

//解密

function decrypt() {

var text = document.getElementById("encrypt").innerText;

var decrypt = CryptoJS.TripleDES.decrypt(text, base64, {

//iv: CryptoJS.enc.Utf8.parse('01234567'),

//mode: CryptoJS.mode.CBC,

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

}

);

//解析數據后轉為UTF-8

var parseData = decrypt.toString(CryptoJS.enc.Utf8);

document.getElementById("decrypt").innerText=parseData;

}

原文:

我是加密數據,點擊下方加密按鈕給我加密

加密編碼后:

解碼解密后:

加密解密

Java端加密解密處理:

key的處理同上述一樣,不足補0,多余則舍棄。為有不同的是:Java使用字符串DESede默認則是3DES加密,且模式使用的是ECB模式,PKCS5Padding ,系統默認配置后的全路徑:DESede/ECB/PKCS5Padding,如果要使用CBC模式需要配置IV偏移量,指定全配置:DESede/CBC/PKCS5Padding,如若與JS端互相調用,則需要兩端加密解密,編碼解碼的key,模式全部相同才可以解析出來。以下是ThreeDESUtils是Java端的加密解密,編碼解碼處理,注意順序:

加密流程:3DES先加密,Base64再編碼

解密流程:Base64先解碼,3DES再解密

這里使用Base64編碼是在android的環境下的,需要在android真機或模擬器上才能運行,如果在測試模式下,則會報錯,后端則使用后端的編碼處理。

import android.util.Base64;

import java.io.UnsupportedEncodingException;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/**

* 3DES加密解密和BASE64編碼解碼混合使用

*/

public class ThreeDESUtils {

//key必須在16位/24位/32位,下面使用的是24位,不足24位則后面余數補0填充滿24位

public static final String key="12345677654321";

//定義加密算法,有DES、DESede(即3DES)、Blowfish

private static final String Algorithm = "DESede";

//如果使用DESede,默認則使用"DESede/ECB/PKCS5Padding" ECB:電子密碼本形式加密,

// BCB:密碼塊鏈接加密

// private static final String DES = "DESede/ECB/PKCS5Padding";

// private static final String DES = "DESede/CBC/PKCS5Padding";

// private static final String DES = "DESede/ECB/NoPadding";

/**

* 3DES加密方法

* @param src 源數據的字節數組

* @return

*/

public static byte[] encryptMode(byte[] src,String key) {

try {

SecretKey deskey = new SecretKeySpec(build3DesKey(key), Algorithm); //生成密鑰

Cipher c1 = Cipher.getInstance(Algorithm); //實例化負責加密/解密的Cipher工具類

c1.init(Cipher.ENCRYPT_MODE, deskey); //初始化為加密模式

return c1.doFinal(src);

} catch (java.security.NoSuchAlgorithmException e1) {

e1.printStackTrace();

} catch (javax.crypto.NoSuchPaddingException e2) {

e2.printStackTrace();

} catch (Exception e3) {

e3.printStackTrace();

}

return null;

}

//3DES解密

public static byte[] decrypt(byte[] data,String key){

try {

SecretKey deskey = new SecretKeySpec(build3DesKey(key), Algorithm); //生成密鑰

Cipher cipher = Cipher.getInstance(Algorithm);

cipher.init(Cipher.DECRYPT_MODE,deskey);

return cipher.doFinal(data);

} catch (Exception ex) {

//解密失敗,打日志

ex.printStackTrace();

}

return null;

}

/**

* 3DES加密Base64編碼處理方法

* @param bytes 字符串轉的數組

* @param key 用於3DES加密解密的密鑰

* @return 經過3DES+Base64加密后的字符串

*/

public static String encode3DesBase64(byte[] bytes, String key){

byte [] base = encryptMode(bytes,key);

return Base64.encodeToString(base,0);

}

/**

* 將3DES+Base64加密后的byte數組進行解密

* @param bytes 先3DES+Base64加密后的 byte數組

* @param key 用於3DES加密解密的密鑰

* @return 未加密前的字符串

*/

public static String decode3DesBase64(byte[] bytes, String key){

byte[] b = null;

String result = null;

try {

b = decrypt(Base64.decode(bytes,0),key);

result = new String(b, "utf-8");

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

//構建3DES密鑰

public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {

byte[] key = new byte[24]; //聲明一個24位的字節數組,默認里面都是0

byte[] temp = keyStr.getBytes("UTF-8"); //將字符串轉成字節數組

/*

* 執行數組拷貝

* System.arraycopy(源數組,從源數組哪里開始拷貝,目標數組,拷貝多少位)

*/

if(key.length > temp.length){

//如果temp不夠24位,則拷貝temp數組整個長度的內容到key數組中

System.arraycopy(temp, 0, key, 0, temp.length);

}else{

//如果temp大於24位,則拷貝temp數組24個長度的內容到key數組中

System.arraycopy(temp, 0, key, 0, key.length);

}

return key;

}

}

上面的Demo都是相通的,通過HTML里面的加密后的數據,java端可以解析出來,反之亦然。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值