【PHP】PHP实现RSA加密,解密,加签,验签

1.php RSA生成公私钥

复制代码
// 生成密钥对
$config = array(
    "digest_alg" => "sha256", // 加密算法
    "private_key_bits" => 2048, // 密钥长度(位数)
);
 
// 创建并保存私钥到文件
$res = openssl_pkey_new($config);
if (!file_put_contents('private.key', $res)) {
    die("无法将私钥写入文件");
}
 
// 获取公钥
$pubKey = openssl_pkey_get_details($res)['key'];
if (empty($pubKey)) {
    die("无法从私钥中提取公钥");
}
 
echo '私钥内容:' . PHP_EOL;
var_dump($res);
 
echo '公钥内容:' . PHP_EOL;
var_dump($pubKey);

2.公钥用于对数据进行加密,私钥用于对数据进行解密;

私钥用于对数据进行签名,公钥用于对签名进行验证。

复制代码
class Rsa
{
    /**
     * private key
     */
    private $_privKey;

    /**
     * public key
     */
    private $_pubKey;

    /**
     * the keys saving path
     */
    private $_keyPath;

    public function __construct ($path)
{
        if (empty($path) || !is_dir($path)) {
            throw new \Exception('Must set the keys save path');
        }
        //设置私钥
        $this->_keyPath = $path;
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';
        $prk = file_get_contents($file);
        $this->_privKey = openssl_pkey_get_private($prk);
        //设置公钥
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';
        $puk = file_get_contents($file);
        $this->_pubKey = openssl_pkey_get_public($puk);
    }



    /**
     * setup the private key
     */
    public function setupPrivKey ()
{
        if (is_resource($this->_privKey)) {
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';
        $prk = file_get_contents($file);
        $this->_privKey = openssl_pkey_get_private($prk);
        return true;
    }

    /**
     * setup the public key
     */
    public function setupPubKey ()
{
        if (is_resource($this->_pubKey)) {
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';
        $puk = file_get_contents($file);
        $this->_pubKey = openssl_pkey_get_public($puk);
        return true;
    }

    /**
     * @function 私钥加密
     * @param $data
     * @return string|null
     */
    public function privEncrypt ($data)
{
        if (!is_string($data)) {
            return null;
        }

        $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
        if ($r) {
            return base64_encode($encrypted);
        }
        return null;
    }

    /**
     * @function 私钥解密
     * @param $data
     * @return string|null
     */
    public function privDecrypt ($encrypted)
{
        if (!is_string($encrypted)) {
            return null;
        }
        $encrypted = base64_decode($encrypted);
        $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
        if ($r) {
            return $decrypted;
        }
        return null;
    }

    /**
     * @function 公钥加密
     * @param $data
     * @return string|null
     */
    public function pubEncrypt ($data)
{
        if (!is_string($data)) {
            return null;
        }
        $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
        if ($r) {
            return base64_encode($encrypted);
        }
        return null;
    }

    /**
     * @function 公钥解密
     * @param $data
     * @return string|null
     */
    public function pubDecrypt ($crypted)
{
        if (!is_string($crypted)) {
            return null;
        }
        $crypted = base64_decode($crypted);
        
        $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
        if ($r) {
            return $decrypted;
        }
        return null;
    }

    /**
     * @function 私钥加签
     * @param $data
     * @return string|null
     */
    public function sign ($data)
{
        if (!is_string($data)) {
            return null;
        }
        openssl_sign($data, $sign, $this->_privKey);
        //base64编码
        $sign = base64_encode($sign);
        return $sign;
    }

    /**
     * @function 公钥验签
     * @param $data
     * @return string|null
     */
    public function verify($data, $sign){
        if (!is_string($data)) {
            return null;
        }
        $result = (bool)openssl_verify($data, base64_decode($sign), $this->_pubKey);
        return $result;
    }


    public function __destruct ()
{
        empty($this->_privKey) ? '' : openssl_free_key($this->_privKey);
        empty($this->_pubKey) ? '' : openssl_free_key($this->_pubKey);
    }
}

使用例子:
class Index
{
    public function index()
{
        $RSA = new Rsa(config('key_path'));

        //对数据公钥加密及私钥解密
        $string = '快乐程序员';

        $pubString = $RSA->pubEncrypt($string);
        echo '用公钥加密后数据:'.$pubString .'<br/>';

        $priDeString = $RSA->privDecrypt($pubString);
        echo '用私钥解密数据:'.$priDeString .'<br/>';

        //实现对数据私钥加签及公钥验签

        $sign = $RSA->sign($string);
        echo '用私钥加签后得到签名:'.$sign .'<br/>';
        $result = $RSA->verify($string,$sign);
        echo '验证签名是否正确:<br/>';
        dump($result);
    }
    
}
相关推荐
源远流长jerry2 小时前
Linux 网络虚拟化深度解析:从 veth 设备对到容器网络实战
linux·运维·服务器·网络·性能优化·php
Java源头6 小时前
PHP 身份证二要素检测
开发语言·php
yoyo_zzm7 小时前
PHP vs Java:后端语言终极选择指南
java·spring boot·后端·架构·php
yoyo_zzm9 小时前
五大编程语言对比:PHP、C、C++、C#、易语言
c语言·c++·php
不会摸鱼的小鱼1 天前
WSL 安装 Ubuntu 22.04 到指定磁盘
数据库·postgresql·php
淼淼爱喝水1 天前
DVWA和Pikachu命令注入漏洞检测实验
安全·web安全·php·pikachu·dvwa
专注VB编程开发20年1 天前
json和python元组,列表,字典对比
开发语言·python·json·php
怀旧,1 天前
【Linux网络编程】15. Reactor 反应堆模式
linux·网络·php
Dylan的码园1 天前
2026年免费远程控制软件哪个好?ToDesk向日葵UU远程免费版横评,不限次数不限时长
服务器·开发语言·php
dog2501 天前
解析几何的力量(1)
服务器·开发语言·网络·php