折腾了一下午 从茫茫百度海里挣扎出来了
废话不多说
RSA 非对称加密效率较低 而且对长度有限制 数据量大的建议不要使用
首先去http://web.chacuo.net/netrsakeypair生成一套公私钥
前端下载 jsencrypt.js (我这里用的是2.3.0)
使用起来也非常简单
let encryptor = new JSEncrypt() // 新建JSEncrypt对象
let publicKey = '-----BEGIN PUBLIC KEY-----'+
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3Nbnoq928KIrZ989fuyQ1ld2p'+
'm1wO8sFmJmGJwpuZ6FKQNJUnSYEEbMhvfoC9zccMQjp7EqmveIixuvTZ54xb4OgS'+
'qcMTtCv+7W+0h666z8PVOD/j3b3WVhktfsgQtyZShl98f1P5sVSJWVUQRZk+j0YX'+
'hc66xqNTW9bliJ8+oQIDAQAB'+
'-----END PUBLIC KEY-----'';
encryptor.setPublicKey(publicKey) // 设置公钥
encryptor.encrypt('需要加密的数据');
后台加密
//加密
openssl_public_encrypt('需要加密的数据',$encAesKey,'公钥');
$encAesKey 就是加密后的数据
//解密
$pi_key = openssl_pkey_get_private('放上刚刚生成的私钥');//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$de_crypted = openssl_private_decrypt(base64_decode('需要解密的数据'),$decrypted,$pi_key);
return json_encode(['code' => 0 , 'data' => $decrypted]);
--------------------------------------------------------------------分割线----------------------------------------------------
接下来是des加解密
前端需要下载两个js文件分别是
crypto-roll.js 和 crypto.js 注意 : 顺序不能反了 参数key与iv(必须要16位字符) 前后台要一致
//加密
function encrypt(str, key, iv) {
var encode_str = '';
key = CryptoJS.MD5(key).toString();
iv = CryptoJS.MD5(iv).toString();
var crypto_key = CryptoJS.enc.Utf8.parse(key);
var crypto_iv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8));
if (typeof (word) == 'string') {
encode_str = CryptoJS.TripleDES.encrypt(str, crypto_key, {
iv: crypto_iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
} else {
encode_str = CryptoJS.TripleDES.encrypt(JSON.stringify(str), crypto_key, {
iv: crypto_iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
}
return encode_str.toString();
}
//解密
function decrypt(str, key, iv) {
key = CryptoJS.MD5(key).toString();
iv = CryptoJS.MD5(iv).toString();
var crypto_key = CryptoJS.enc.Utf8.parse(key);
var crypto_iv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8));
var decrypt_str = CryptoJS.TripleDES.decrypt(str, crypto_key, {
iv: crypto_iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypt_str.toString(CryptoJS.enc.Utf8);
}
后台代码
/**
* name des加解密
* Class Des
*/
class Des
{
/**
* @param $data
* @param $key
* @param $iv
* @return false|string
*/
public static function decrypt($data, $key, $iv)
{
$data = base64_decode($data);
$key = md5($key);
$iv = substr(md5($iv), 0, 8); //取前8位
$decrypted = openssl_decrypt($data, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
/**
* @param $str
* @param $key
* @param $iv
* @return string
*/
public static function encrypt($str, $key, $iv)
{
$key = md5($key);
$iv = substr(md5($iv), 0, 8); //取前8位
$data = base64_encode(openssl_encrypt($str, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv));
return $data;
}