本文实例讲述了ThinkPHP实现的rsa非对称加密类。分享给大家供大家参考,具体如下:
公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。
私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有公钥也是看不出来内容的,仅允许给予公钥的第三方来解密并看到内容,实际作用相当于签名功能,如果能拿到未加密的内容,说明一定是信任方的数据,因为有他的签名啊。
其实这种非对称加密技术可以用于单点登录中去,安全级别高,能解密获取到内容应该就是信任方的数据。
PHP;">
'CN','stateOrProvinceName'=>'beijing','localityName'=>'beijing','organizationName'=>'clcw','organizationalUnitName'=>'clcw','commonName'=>'clcw','emailAddress'=>'service@clcw.com.cn');
$privkeypass = 'secret'; //私钥密码
$numberOfDays = 365; //有效时长,单位为天
//生成证书
$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn,$privkey);
$sscert = openssl_csr_sign($csr,null,$privkey,$numberOfDays);
openssl_x509_export_to_file($sscert,self::CERPATH);
openssl_pkcs12_export_to_file($sscert,self::PFXPATH,$privkeypass);
(file_exists(self::CERPATH)) or die('公钥的文件路径错误');
(file_exists(self::PFXPATH)) or die('密钥的文件路径错误');
}
public static function verifyData($originData,$decryptData)
{
$cer_key = file_get_contents(self::$cerpath);
$cer = openssl_x509_read($cer_key);
$res = openssl_verify($originData,$decryptData,$cer);
var_dump($res);
}
/**
* 生成公钥私钥文件
* @param $appName string 应用名称
*/
public static function generateKey($appName='')
{
$result = ['status'=>0,'msg'=>''];
if (!extension_loaded('openssl') ) {
$result['msg'] = 'PHP需要openssl支持';
}
//创建公钥
$res = openssl_pkey_new();//array('private_key_bits'=>512) 这一串参数不加,否则只能加密54个长度的字符串
//提取私钥
openssl_pkey_export($res,$privatekey);
//生成公钥
$public_key = openssl_pkey_get_details($res);
$publickey = $public_key['key'];
// $path = self::FILEDIR.$appName;
try{
// file_put_contents($path.'_public.pem',$publickey);
// file_put_contents($path.'_private.pem',$privatekey);
$result['status'] = 1;
$result['publickey'] = $publickey;
$result['privatekey'] = $privatekey;
}catch(\Exception $e) {
// throw new \Exception($e->getMessage());
$result['msg'] = $e->getMessage();
}
return $result;
}
/**
* 用私钥加密数据
* @param $data string 需要加密的字符串(最好不要超过200个字符)
* @param $appName string 应用名称
*/
public static function privateEncrypt($data,$appName)
{
$result = ['status'=>0,'msg'=>''];
$privatekey = C($appName.'.PRIVATE_KEY');
$myinfo = 'In '.__METHOD__.',privatekey:'.$privatekey."\n";
file_put_contents('/tmp/shiyf.log',$myinfo,FILE_APPEND);
//生成resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
$privatekey = openssl_pkey_get_private($privatekey);
if (empty($privatekey)) {
$result['msg'] = '密钥不可用';
}
$encryptData = '';
//用私钥加密
if (openssl_private_encrypt($data,$encryptData,$privatekey)) {
$result['msg'] = base64_encode($encryptData);
$result['status'] = 1;
} else {
$result['msg'] = '加密失败!';
}
return $result;
}
/**
* 用公钥解密数据
* @param $data string 需要解密的字符串(最好不要超过200个字符)
* @param $appName string 应用名称
*/
public static function publicDecrypt($data,'msg'=>''];
$data = base64_decode($data);
$publickey = C($appName.'.PUBLIC_KEY');
//生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
$publickey = openssl_pkey_get_public($publickey);
if (empty($publickey)) {
$result['msg'] = '公钥不可用';
}
//解密数据
$decryptData = '';
if (openssl_public_decrypt($data,$publickey)) {
$result['msg'] = $decryptData;
$result['status'] = 1;
} else {
$result['msg'] = '解密失败';
}
return $result;
}
/**
* 用公钥加密数据
* @param $data string 需要加密的字符串(最好不要超过200个字符)
* @param $appName string 应用名称
*/
public static function publicEncrypt($data,$publickey)
{
$result = ['status'=>0,'msg'=>''];
//生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_private函数返回false
$publickey = openssl_pkey_get_public($publickey);
if (empty($publickey)) {
$result['msg'] = '公钥不可用';
}
$encryptData = '';
//用私钥加密
if (openssl_public_encrypt($data,$publickey)) {
$result['msg'] = base64_encode($encryptData);
$result['status'] = 1;
} else {
$result['msg'] = '加密失败!';
}
return $result;
}
/**
* 用私钥加密数据
* @param $data string 需要解密的字符串(最好不要超过200个字符)
* @param $appName string 应用名称
*/
public static function privateDecrypt($data,'msg'=>''];
$data = base64_decode($data);
$privatekey = C($appName.'.PRIVATE_KEY');
//生成resource类型的私钥,如果私钥文件内容被破坏,openssl_pkey_get_public函数返回false
$privatekey = openssl_pkey_get_private($privatekey);
if (empty($privatekey)) {
$result['msg'] = '私钥不可用';
}
//解密数据
$decryptData = '';
if (openssl_private_decrypt($data,$privatekey)) {
$result['msg'] = $decryptData;
$result['status'] = 1;
} else {
$result['msg'] = '解密失败';
}
return $result;
}
}
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
在线sha1/sha224/sha256/sha384/sha512加密工具:
原文链接:https://www.f2er.com/thinkphp/16000.html