前端代码
传递到php后台的是公钥加密的数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<!-- 引入jsencrypt.js文件 -->
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
</head>
<body>
<script>
//公钥 PKCS8(JAVA适用)
var PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBA';
//私钥
var PRIVATE_KEY ='MIICdwIBADANBgkqhkiG9';
//PKCS1(非JAVA适用)
//var PUBLIC_KEY ='MIGfMA0GCSqGSIb';
//var PRIVATE_KEY ='MIICWwIBAAKBgQCXn41';
//使用公钥加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
var encrypted = encrypt.encrypt("张三666");
console.log('加密后数据:%o', encrypted);
//使用私钥解密 不需要可以删除,方便测试查看使用
var decrypt = new JSEncrypt();
decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+PRIVATE_KEY+'-----END RSA PRIVATE KEY-----');
var uncrypted = decrypt.decrypt(encrypted);
console.log('解密后数据:%o', uncrypted); // 张三
//ajax 请求后台
$.ajax
({
url: "/index/Test/rsa",
dataType: "json",
type: "POST",
data: {
encrypted: encrypted,
},
success:function(res){
console.log(res); //解密后的数据
},
error:function(){
alert('failed!');
},
});
</script>
</body>
</html>
后台私钥php解密
public function rsa(){
if($this->request->isPost()){
$encrypted=$this->request->post('encrypted');
//私钥 PKCS8(JAVA适用)
$pri ='MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwg';
//PKCS1(非JAVA适用) 解密不了
//$pri ='MIICWwIBAAKBgQCXn41kvOtvur5bwUMW';
//解密方式一
$pem = chunk_split($pri, 64, "\n");
$pem = "-----BEGIN PRIVATE KEY-----\n" . $pem . "-----END PRIVATE KEY-----\n";
$prikeyid = openssl_pkey_get_private($pem);
$crypttext = base64_decode($encrypted);
if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, OPENSSL_PKCS1_PADDING))
{
$this->success('成功','',['后台解密结果'=> $sourcestr]);
}
//解密方式二,我用的fastadmin系统,自带了rsa解密类,如果系统没有请使用解密方式一
/* $rsa=new \fast\Rsa('',$pri);
$this->success('成功','',['后台解密结果'=> $rsa->privDecrypt($encrypted)]);*/
}
return $this->view->fetch();
}
***如果解密不了,整理下公钥的字符串格式,还有就是生成的非JAVA的私钥也是解密不了的