Skip to content

PHP 使用 RSA 非对称加密进行数据加密传输

介绍

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠
来自 维基百科

非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

使用

创建私钥、公钥

$ openssl
openssl> genrsa -out rsa_private_key.pem 4096
openssl> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

类库

php
<?php 

namespace System\Classes\Crypt;
use Poppy\Framework\Classes\Traits\AppTrait;
class RsaCrypt
{

    use AppTrait;
    
    private static $privateKey = '-----BEGIN RSA PRIVATE KEY-----';
    private static $publicKey  = '-----BEGIN PUBLIC KEY-----';
    
    /**
    * 设置私有 key
    * @param $private_key
    */
    public function setPrivateKey($private_xkey)
    {
        self::$privateKey = $private_key;
    }
    
    /**
    * 设置公有key
    * @param $public_key
    */
    public function setPublicKey($public_key)
    {
        self::$publicKey = $public_key;
    }
    
    /**
    * 使用私钥进行签名
    * Rsa2 进行签名
    * @param  string $data
    * @return string
    */
    public function sign($data): string
    {
        $priKey = str_replace([
                              '-----BEGIN RSA PRIVATE KEY-----',
                              '-----END RSA PRIVATE KEY-----',
                              "\n",
                              ], '', self::$privateKey);
        $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
            wordwrap($priKey, 64, "\n", true) .
            "\n-----END RSA PRIVATE KEY-----";
        openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
        return base64_encode($sign);
    }
    
    /**
    * 对签名进行验证
    * @param string $data
    * @param string $sign
    * @return bool
    */
    public function verify($data = '', $sign = ''): bool
    {
        $publicKey = str_replace([
                                 '-----BEGIN PUBLIC KEY-----',
                                 '-----END PUBLIC KEY-----',
                                 "\n",
                                 ], '', self::$publicKey);
        $res = "-----BEGIN PUBLIC KEY-----\n" .
            wordwrap($publicKey, 64, "\n", true) .
            "\n-----END PUBLIC KEY-----";
        $sign = base64_decode($sign);
        return openssl_verify($data, $sign, $res, OPENSSL_ALGO_SHA256) > 0;
    }
}

?>

使用

php
// generate sign
$rsa = new RsaCrypt();
$rsa->setPrivateKey('-----BEGIN RSA PRIVATE KEY-----.....');
$sign = $rsa->sign('abc');
// verify sign
$rsa = new RsaCrypt();
$rsa->setPublicKey('-----BEGIN PUBLIC KEY-----......');
$rsa->verify('abc', $sign);

参考文章


说明

创建时间: 2023-01-15 00:38:00 , 最后编辑于 2023-11-24 15:19:00