JAVA 端进行加密数据 message为要加密的数据。 testtest为key 数组iv1为 iv
String m=encryptDESS("message","testtest");
Log.e("EntryActivity---m1=", m );//m 的值为 "r9Vw/Plt9II=\n"
//succeed
private byte[] iv1 = {1, 2, 3, 4, 5, 6, 7, 8};
public String encryptDESS(String encryptString, String encryptKey) {
try {
IvParameterSpec zeroIv = new IvParameterSpec(iv1);
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encodeToString(encryptedData,Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
小程序端进行解密。小程序端导入tripledes.js 调用CryptoJS的方法。
CryptoJS 下载地址 https://github.com/sytelus/CryptoJS
小程序tripledes.js尾部需要申明才能调用
var CryptoJS = require('../../utils/tripledes.js')
dec: function() {
//解密
var iv = [1, 2, 3, 4, 5, 6, 7, 8];
var ivString = byteToString(iv)
var key = CryptoJS.enc.Utf8.parse("testtest");
var iv = CryptoJS.enc.Utf8.parse(ivString);
var s = CryptoJS.DES.decrypt("r9Vw/Plt9II=\n", key, {
iv: iv,
mode: CryptoJS.mode.CBC, //可省略
padding: CryptoJS.pad.Pkcs7 //可省略
}).toString(CryptoJS.enc.Utf8);
//输出:message
console.log(s);
}
//此方法将数组转为string
function byteToString(arr) {
if (typeof arr === 'string') {
return arr;
}
var str = '',
_arr = arr;
for (var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if (v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for (var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
}
经过测试用java的
DES/CBC/PKCS5Padding 进行加密。小程序是可以解密并且得到数据的。
但是用
DESede/CBC/PKCS5Padding 进行加密的数据。小程序怎么也解密不了。
现贴上JAVA代码。有高人知道怎么解密的指点一下。
同上 message 为要加密的信息。npiTUAL6InCrYPLA++dbtlQfnqCNoVG4 为秘钥key 。iv依旧是数组。
String s=decryptDES("message","npiTUAL6InCrYPLA++dbtlQfnqCNoVG4");
//输出 s 的值为 "BPsMBJF3c1o=\n"
private byte[] iv2 = {1, 2, 3, 4, 5, 6, 7, 8};
public String encryptDEST(String encryptString, String encryptKey) {
try {
IvParameterSpec zeroIv = new IvParameterSpec(iv2);
SecretKeySpec key = new SecretKeySpec(Base64.decode(encryptKey,Base64.DEFAULT), "DESede");
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encodeToString(encryptedData,Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
用小程序去解密的时候得不到任何数据
dec: function() {
//解密
var iv = [1, 2, 3, 4, 5, 6, 7, 8];
var ivString = byteToString(iv)
var key = CryptoJS.enc.Utf8.parse("npiTUAL6InCrYPLA++dbtlQfnqCNoVG4");
var iv = CryptoJS.enc.Utf8.parse(ivString);
var s = CryptoJS.DES.decrypt("BPsMBJF3c1o=\n", key, {
iv: iv,
mode: CryptoJS.mode.CBC, //可省略
padding: CryptoJS.pad.Pkcs7 //可省略
}).toString(CryptoJS.enc.Utf8);
//输出:""
console.log(s);
}
用同样的方法解密输出了空字符。不知道哪里出错了。求指导。
来源:oschina
链接:https://my.oschina.net/u/4309139/blog/4275953