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;
}
}
//JS使用 javascript应该没用到crypto-js.js就可以了
<script type="text/javascript" src="js/crypto-js.js" charset="UTF-8"></script>
<script type="text/javascript" src="js/jsencrypt.js" charset="UTF-8"></script>
function encrypt(textStr) {
var key = "THISISAKEY";
//key不足24位自动以0(最小位数是0)补齐,如果多余24位,则截取前24位,后面多余则舍弃掉
var base64 = CryptoJS.enc.Utf8.parse(key)
var encrypt = CryptoJS.TripleDES.encrypt(textStr, base64, {
//iv: CryptoJS.enc.Utf8.parse('01234567'),//iv偏移量
//mode: CryptoJS.mode.CBC, //CBC模式
mode: CryptoJS.mode.ECB, //ECB模式
padding: CryptoJS.pad.Pkcs7//padding处理
}
);
encryptData = encrypt.toString();//加密完成后,转换成字符串
return encryptData;
}
//解密
function decrypt(textStr , key) {
//key不足24位自动以0(最小位数是0)补齐,如果多余24位,则截取前24位,后面多余则舍弃掉
var base64 = CryptoJS.enc.Utf8.parse(key)
var decrypt = CryptoJS.TripleDES.decrypt(textStr, base64, {
//iv: CryptoJS.enc.Utf8.parse('01234567'),//iv偏移量
//mode: CryptoJS.mode.CBC, //CBC模式
mode: CryptoJS.mode.ECB, //ECB模式
padding: CryptoJS.pad.Pkcs7//padding处理
}
);
//decryptData = decrypt.toString();
return decrypt.toString(CryptoJS.enc.Utf8);
}
/**
* Shortcut functions to the cipher's object interface.
*
* @example
*
* var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
* var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
*/