最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式,
需要传入内容,密钥,初始化向量3个参数
var server = require('../../utils/server.js');var CryptoJS = require('../../utils/tripledes.js');
Page({/**
* 页面的初始数据*/data: {
val:''},
input(e) {var val =e.detail.value;this.encrypt(val);
},
encrypt(val) {var pwd = 'lib123123'; //这里需要传入8个字节以上的密钥
var iv = '123123123';var encryptData = this.encryptByDESModeCBCUtf8to64(val, pwd, iv);
console.log(encryptData);this.setData({
encryptData: encryptData
})
server.postJSON('Index/decrypt', { data: encryptData, pwd: pwd, iv: iv }, function(res) {
console.log(res);
})
},
encryptByDESModeCBCUtf8to64(message, key, iv) {var keyHex =CryptoJS.enc.Utf8.parse(key);var ivHex =CryptoJS.enc.Utf8.parse(iv);var encrypted =CryptoJS.DES.encrypt(message, keyHex, {
iv: ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})returnencrypted.ciphertext.toString(CryptoJS.enc.Base64);
}
})
{{encryptData}}
输入内容,然后会进行des加密
后台使用的PHP进行des解密的,因为刚学PHP没多久,所以借鉴了网上的方法
public functiondecrypt(){$data=I('post.data');$pwd=I('post.pwd');$iv=I('post.iv');$encrypted = base64_decode($data); //如需转换二进制可改成 bin2hex 转换
$key = str_pad($pwd,8,'0'); //3DES加密将8改为24
$td = mcrypt_module_open(MCRYPT_DES,'',MCRYPT_MODE_CBC,'');//3DES加密将MCRYPT_DES改为MCRYPT_3DES
if( $iv == '')
{$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
}
@mcrypt_generic_init($td, $key, $iv);$decrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);$y=$this->pkcs5_unpad($decrypted);$this->ajaxReturn($y);
}function pkcs5_unpad($text){$pad = ord($text{strlen($text)-1});if ($pad > strlen($text)) {return false;
}if (strspn($text, chr($pad), strlen($text) - $pad) != $pad){return false;
}return substr($text, 0, -1 * $pad);
}
最终前端获取的结果就是加密输入的内容
在这里,我遇到过一个小问题,就是mcrypt_module_open函数使用不了,开始网上找了很多方法,有去掉extension前面分号的,
还有就是下载php_mcrypt.dll和libmcrypt.dll,都没有成功,最终结果还是因为phpstrom版本太高,这个函数在最新版本不兼容,
所以如果有类似小伙伴遇到mcrypt_module_open函数不能用的情况下,看下编辑器版本是否过高