<?php
// 生成 openssl
// 在浏览器中右键查看源码,可查看到格式字符串
class Rsa
{
public $privateKey = '';
public $publicKey = '';
public function __construct()
{
$confs = array(
// 在我的环境中,这里必须配置一个存在openssl.cnf文件的目录
// 其实我本地电脑中独立安装着一个 openssl ,环境变量中也是存在的
// 下面路径使用的是WEB集成环境中的路径
// 原因不理解,分析:也许是因为为了防止出错,才要求必须配置cnf路径
'config' => 'D:\tool\Apache\conf\openssl.cnf',
// 默认为 1024 ,可改为 512 的倍数(1024/1536/2048/... ),不知道封顶值是多少
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
);
$resource = openssl_pkey_new($confs);
openssl_pkey_export($resource, $this->privateKey, null, $confs);
$detail = openssl_pkey_get_details($resource);
$this->publicKey = $detail['key'];
// var_dump($this->privateKey);
// var_dump($this->publicKey);
}
// 使用公钥加密
public function publicEncrypt($data, $publicKey)
{
openssl_public_encrypt($data, $encrypted, $publicKey);
return $encrypted;
}
// 使用公钥解密
public function publicDecrypt($data, $publicKey)
{
openssl_public_decrypt($data, $decrypted, $publicKey);
return $decrypted;
}
// 使用私钥加密
public function privateEncrypt($data, $privateKey)
{
openssl_private_encrypt($data, $encrypted, $privateKey);
return $encrypted;
}
// 使用私钥解密
public function privateDecrypt($data, $privateKey)
{
openssl_private_decrypt($data, $decrypted, $privateKey);
return $decrypted;
}
// 发送数据前
// base64在url传递过程中需要注意的
// 把base64加密后在url传输,会把“+”,“/”分别替换为“-”,“_”,以及会把末尾的等号“=”去掉。
// 另外base64加密后的长度必然是4的倍数,所以可以根据这个还原“=”号
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
// return $data; //不处理会乱码
// return base64_encode($data);
}
// 接收数据后 按约定还原base64加密过的数据
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
}
$rsa = new Rsa();
echo "公钥:<br>\n", $rsa->publicKey, "<br>\n";
echo "私钥:<br>\n", $rsa->privateKey, "<br>\n";
// 使用公钥加密
$dataStr = '我的博客mrdede.com';
$str = $rsa->publicEncrypt($dataStr, $rsa->publicKey);
// 这里使用base64是为了不出现乱码,默认加密出来的值有乱码
$str = base64_encode($str);
echo "公钥加密(base64处理过):\n", $str, "\n";
$str = base64_decode($str);
$pubstr = $rsa->publicDecrypt($str, $rsa->publicKey);
echo "公钥解密:\n", $pubstr, "\n";
$privstr = $rsa->privateDecrypt($str, $rsa->privateKey);
echo "私钥解密:\n", $privstr, "\n";
// 使用私钥加密
$dataStr = '我是好人';
$str = $rsa->privateEncrypt($dataStr, $rsa->privateKey);
// 这里使用base64是为了不出现乱码,默认加密出来的值有乱码
$str = base64_encode($str);
echo "私钥加密(base64处理过):\n", $str, "\n";
$str = base64_decode($str);
$pubstr = $rsa->publicDecrypt($str, $rsa->publicKey);
echo "公钥解密:\n", $pubstr, "\n";
$privstr = $rsa->privateDecrypt($str, $rsa->privateKey);
echo "私钥解密:\n", $privstr, "\n";
// 使用约定编辑发送/接收数据
$dataStr = '使用约定编辑发送/接收数据';
$str = $rsa->publicEncrypt($dataStr, $rsa->publicKey);
echo "加密前未处理过:\n", $str, "\n";
// 这里使用base64是为了不出现乱码,默认加密出来的值有乱码
$str = $rsa->base64url_encode($str);
echo "私钥加密(编码处理过):\n", $str, "\n";
$str = $rsa->base64url_decode($str);
echo "解密前解码处理过:\n", $str, "\n";
$privstr = $rsa->privateDecrypt($str, $rsa->privateKey);
echo "私钥解密:\n", $privstr, "\n";