PHP RSA加密解密
介绍
RSA算法属于非对称加密算法,非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密
准备
需要给PHP打开OpenSSL模块
代码
/**
* RSA算法属于非对称加密算法,非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密.
* 需要给PHP打开OpenSSL模块
* 生成公钥和私钥的链接: http://web.chacuo.net/netrsakeypair
* openssl_pkey_get_public //检查公钥是否可用
* openssl_public_encrypt //公钥加密
* openssl_pkey_get_private //检查私钥是否可用
* openssl_private_decrypt //私钥解密
*
*/
// $str = '封装测试';
$str = json_encode([ 'a'=>1, 'b'=>2, 'f'=>6,]);
$cdata = RSA_openssl($str);
var_dump($cdata);
echo "<hr>";
$ddata = RSA_openssl($cdata,'decode');
var_dump($ddata);
/**
* RSA数据加密解密
* @param type $data
* @param type $type encode加密 decode解密
*/
function RSA_openssl($data,$type='encode'){
if (empty($data)) {
return 'data参数不能为空';
}
if (is_array($data)) {
return 'data参数不能是数组形式';
}
$rsa_public = config('rsa_public');
if(empty($rsa_public)){
$rsa_public = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkANmC849IOntYQQdSgLvMMGm
8V/u838ATHaoZwvweoYyd+/7Wx+bx5bdktJb46YbqS1vz3VRdXsyJIWhpNcmtKhY
inwcl83aLtzJeKsznppqMyAIseaKIeAm6tT8uttNkr2zOymL/PbMpByTQeEFlyy1
poLBwrol0F4USc+owwIDAQAB
-----END PUBLIC KEY-----';
}
$rsa_private = config('rsa_private');
if(empty($rsa_private)){
$rsa_private = '-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaQA2YLzj0g6e1h
BB1KAu8wwabxX+7zfwBMdqhnC/B6hjJ37/tbH5vHlt2S0lvjphupLW/PdVF1ezIk
haGk1ya0qFiKfByXzdou3Ml4qzOemmozIAix5ooh4Cbq1Py6202SvbM7KYv89syk
HJNB4QWXLLWmgsHCuiXQXhRJz6jDAgMBAAECgYAIF5cSriAm+CJlVgFNKvtZg5Tk
93UhttLEwPJC3D7IQCuk6A7Qt2yhtOCvgyKVNEotrdp3RCz++CY0GXIkmE2bj7i0
fv5vT3kWvO9nImGhTBH6QlFDxc9+p3ukwsonnCshkSV9gmH5NB/yFoH1m8tck2Gm
BXDj+bBGUoKGWtQ7gQJBANR/jd5ZKf6unLsgpFUS/kNBgUa+EhVg2tfr9OMioWDv
MSqzG/sARQ2AbO00ytpkbAKxxKkObPYsn47MWsf5970CQQDIqRiGmCY5QDAaejW4
HbOcsSovoxTqu1scGc3Qd6GYvLHujKDoubZdXCVOYQUMEnCD5j7kdNxPbVzdzXll
9+p/AkEAu/34iXwCbgEWQWp4V5dNAD0kXGxs3SLpmNpztLn/YR1bNvZry5wKew5h
z1zEFX+AGsYgQJu1g/goVJGvwnj/VQJAOe6f9xPsTTEb8jkAU2S323BG1rQFsPNg
jY9hnWM8k2U/FbkiJ66eWPvmhWd7Vo3oUBxkYf7fMEtJuXu+JdNarwJAAwJK0YmO
LxP4U+gTrj7y/j/feArDqBukSngcDFnAKu1hsc68FJ/vT5iOC6S7YpRJkp8egj5o
pCcWaTO3GgC5Kg==
-----END PRIVATE KEY-----';
}
//私钥解密
if ($type=='decode') {
$private_key = openssl_pkey_get_private($rsa_private);
if (!$private_key) {
return('私钥不可用');
}
$return_de = openssl_private_decrypt(base64_decode($data), $decrypted, $private_key);
if (!$return_de) {
return('解密失败,请检查RSA秘钥');
}
return $decrypted;
}
//公钥加密
$key = openssl_pkey_get_public($rsa_public);
if (!$key) {
return('公钥不可用');
}
//openssl_public_encrypt 第一个参数只能是string
//openssl_public_encrypt 第二个参数是处理后的数据
//openssl_public_encrypt 第三个参数是openssl_pkey_get_public返回的资源类型
$return_en = openssl_public_encrypt($data, $crypted, $key);
if (!$return_en) {
return('加密失败,请检查RSA秘钥');
}
return base64_encode($crypted);
}
tp5使用
/**
* RSA数据加密解密
* @param string $data
* @param string $type encode加密 decode解密
*/
function RSA_openssl($data, $type = 'encode')
{
if (empty($data)) {
return 'data参数不能为空';
}
if (is_array($data)) {
return 'data参数不能是数组形式';
}
$rsa_public = file_get_contents(EXTEND_PATH . 'rsa_public_key.pem');//公钥地址
$rsa_private = file_get_contents(EXTEND_PATH . 'rsa_private_key.pem');//私钥地址
//私钥解密
if ($type == 'decode') {
$private_key = openssl_pkey_get_private($rsa_private);
if (!$private_key) {
return ('私钥不可用');
}
$return_de = openssl_private_decrypt(base64_decode($data), $decrypted, $private_key);
if (!$return_de) {
return ('解密失败,请检查RSA秘钥');
}
return $decrypted;
}
//公钥加密
$key = openssl_pkey_get_public($rsa_public);
if (!$key) {
return ('公钥不可用');
}
//openssl_public_encrypt 第一个参数只能是string
//openssl_public_encrypt 第二个参数是处理后的数据
//openssl_public_encrypt 第三个参数是openssl_pkey_get_public返回的资源类型
$return_en = openssl_public_encrypt($data, $crypted, $key);
if (!$return_en) {
return ('加密失败,请检查RSA秘钥');
}
return base64_encode($crypted);
}
本文作者:断桥残雪丶
本文链接:https://www.cnblogs.com/codexing/p/16455334.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步