easyclick默认的DES加密,使用了默认值,所以你在php或者各其它版本将不可确定。为了兼容各平台,使用自定义des设定值。
基础知识我想前两篇文章,我做了些总结,不急着用代码可以学习一下:
java.util.Base64与android.util.Base64兼容
java.util.Base64与android.util.Base64兼容
这里给大家一个固定的代码,其中密码key部分你可自行修改
//importClass(android.util.Base64);
importClass(java.util.Base64);
//importClass(java.security.SecureRandom);
importClass(java.security.Key);
importClass(javax.crypto.Cipher);
importClass(javax.crypto.SecretKey);
importClass(javax.crypto.SecretKeyFactory);
importClass(javax.crypto.spec.DESKeySpec);
importClass(javax.crypto.spec.IvParameterSpec);
importClass(java.security.spec.AlgorithmParameterSpec);
//Base64.NO_WRAP 与 java.util.Base64 相同
let DES = (function () {
let ALGORITHM_DES = "DES/CBC/PKCS5Padding";
let IV = new IvParameterSpec(new java.lang.String("12345678").getBytes());
function DES() {
}
DES.prototype.encode = function (data,key) {
return encode(data,key);
}
DES.prototype.decode = function (data,key) {
return decode(data,key);
}
/**
* DES算法,加密
*
* @param data
* 待加密字符串
* @param key
* 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws Exception
*/
function encode(data,key) {
if (data == null)
return null;
try {
let dks = new DESKeySpec(new java.lang.String(key.substring(0,8)).getBytes());
let keyFactory = SecretKeyFactory.getInstance("DES");
// key的长度不能够小于8位字节
let secretKey = keyFactory.generateSecret(dks);
let cipher = Cipher.getInstance(ALGORITHM_DES);
let iv = IV;
let paramSpec = iv; //AlgorithmParameterSpec
cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
let bytes = cipher.doFinal(new java.lang.String(data).getBytes()); //byte[]
//let str=Base64.encode(bytes, Base64.NO_WRAP); //, bytes.length, 0
let str=Base64.getEncoder().encodeToString(bytes);
//return new java.lang.String(str);
return str;
} catch (e) {
logd(e);
return data;
}
}
/**
* DES算法,解密
*
* @param data
* 待解密字符串
* @param key
* 解密私钥,长度不能够小于8位
* @return 解密后的字节数组
* @throws Exception
* 异常
*/
function decode(data, key) {
if (data == null)
return null;
try {
let dks = new DESKeySpec(new java.lang.String(key.substring(0,8)).getBytes());
let keyFactory = SecretKeyFactory.getInstance("DES");
// key的长度不能够小于8位字节
let secretKey = keyFactory.generateSecret(dks);
let cipher = Cipher.getInstance(ALGORITHM_DES);
let iv = IV //IvParameterSpec
let paramSpec = iv; //AlgorithmParameterSpec
cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
//return new java.lang.String(cipher.doFinal(byte2hex(data.getBytes())));
//return new java.lang.String(cipher.doFinal(byte2hex(Base64.decode(data,0))),"UTF-8");
//return new java.lang.String(cipher.doFinal(Base64.decode(data,Base64.NO_WRAP)));
return new java.lang.String(cipher.doFinal(Base64.getDecoder().decode(data)));
} catch (e) {
//e.printStackTrace();
logd(e);
return data;
}
}
/*
function byte2hex(buf) {
let sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
let hex = java.lang.Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
*/
return DES;
})();
使用范例
let bakContent ="我是一个待加密的内容我的秘密";
let bakPwd = "fjly1234";
let desFunc=new DES();
let ee = desFunc.encode(bakContent,bakPwd)+'';
logd("加密后的数据-> "+ee);
let dd = desFunc.decode(ee,bakPwd)+'';
logd("解密后的数据-> "+dd);
完毕