为了账号安全,请及时绑定邮箱和手机立即绑定

非对称加密详解(附带源码实现)

标签:
PHP

什么是非对称加密?

————————————————————————————————————————

非对称加密主要分为公钥私钥两个核心概念,理解了这两个概念就等于理解了整个算法的核心。

现在假设我有两把两把钥匙,钥匙1钥匙2,我把钥匙2自己留着,把钥匙1公开给全班的同学,这时候,钥匙2就是私钥,钥匙1就是公钥。

那么这两把钥匙有什么用呢?假设现在班里有个同学想给我写信,但是信件内容十分敏感(例如什么表白的话语),他不想给别的同学看到,于是他用拿到的钥匙1把这封信件的内容进行了加密,然后发给了我。在这个途中,如果被其他同学截断了,拿到了加密后的信件,他们也无法使用他们的钥匙1进行解密。因为钥匙1加密后,只能由我手上的这把钥匙2进行解密,所以也只有我能读到这封信件的真实内容。

上面这个案例就是十分典型的公钥加密的应用。


私钥加密

————————————————————————————————————————

刚刚讲解了公钥加密的使用,那么私钥加密又是什么呢?

首先,我们知道了钥匙1加密的内容只可以由钥匙2进行解密,那么同理可得,钥匙2加密的内容,也只有钥匙1进行解密。

同样用上面的写信作为例子:刚刚我收到了同学给我的加密信件,我想要回封信给那个同学,但是我担心有别人冒充我进行回信,于是我使用我的钥匙2对信件进行了加密,然后回信给了那位同学。那位同学收到了我的信件,使用他的钥匙1进行解密,发现解密成功了!那么就可以确定这封信是我发的,因为只有我拥有钥匙2,而他的钥匙1只能解密我钥匙2加密后的内容。

所以,私钥加密的作用并不是防止别人偷看内容,而是确保这个信件的发件人一定是我。


php实现

————————————————————————————————————————

加密算法:

class Rsa {      
    private static $PRIVATE_KEY = '-----BEGIN RSA PRIVATE KEY-----MIICXgIBAAKBgQCoZZ8iUBprOIc0kGckr5ax6/Fd9IKKMc/XHayKEAvqpS0oz0b1ojEkpkdZBk0OWNhp73YNV+YLKBwwxOwb3u3hl8nBLoG/RilEbBMdCf55cUzNsfn/XF5CiLr/aci/OHuTe6ULvXs280T5M+nUh3iKdiT6z9XrFbH69C+xFoNInwIDAQABAoGAe+ape7msdo+VC5vkCB4ZprePVC3/jmawIfr3ZG4CFpeJ7qjz8O9xcSHXBS2ZrKC6Otex6Idv/213sHpzrt4L7+rSrgMOauWNjSVjr4T4Z168uvsnNocn+3GWfzbBPQj3PhjE64R/MkWDvuq2UK945WYtqFaC6LT1mJAXhjxqpiECQQDYGWYbCsUgQS0LnDzReyotkb9Eyr5UGlI8Nzn3PvwwkIS3N3yUsm2t3UokOw02DlhkC4f1aT097fM1w0FruSNNAkEAx31taitIGwgJg+yPmvwTs8AENm0wxi/V6loEXPBPxX2R4NjSG+ExYzA7/daDq//McKsX0EcYcsFN0E3HwSANmwJBAJUXGOHpUU1Kiihrd25TWissVdjBRATEUB4pP/2738QlwNqjFnmEjLUaak+KyjeUOBl19ywymkUCyPw7pQQMLDUCQQC84DKSDPyuK0PnFjk5QmXdEHZsmaFOY8gjpKrw286La8KMonz8TJCYGvkR8uKkHQMRwcxANLAfJopoKNxyK8j1AkEAwcY3EHeKe4i3FhCjGSqAGAzFFBS1jzTNZxw/cxMMCbfxFH4WvhowqoC1iAKDyZ7HF7V+RcxcfuhoBJi/3+ImEg==-----END RSA PRIVATE KEY-----';      
    private static $PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoZZ8iUBprOIc0kGckr5ax6/Fd9IKKMc/XHayKEAvqpS0oz0b1ojEkpkdZBk0OWNhp73YNV+YLKBwwxOwb3u3hl8nBLoG/RilEbBMdCf55cUzNsfn/XF5CiLr/aci/OHuTe6ULvXs280T5M+nUh3iKdiT6z9XrFbH69C+xFoNInwIDAQAB-----END PUBLIC KEY-----';     
  
    /**      
     * 获取私钥      
     * @return bool|resource      
     */      
    private static function getPrivateKey()   
    {          
        $privKey = self::$PRIVATE_KEY;          
        return openssl_pkey_get_private($privKey);      
    }      
  
    /**      
     * 获取公钥      
     * @return bool|resource      
     */      
    private static function getPublicKey()  
    {          
        $publicKey = self::$PUBLIC_KEY;          
        return openssl_pkey_get_public($publicKey);      
    }      
  
    /**      
     * 私钥加密      
     * @param string $data      
     * @return null|string      
     */      
    public static function privEncrypt($data = '')      
    {          
        if (!is_string($data)) {              
            return null;         
        }          
        return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null;      
    }      
  
    /**      
     * 公钥加密      
     * @param string $data      
     * @return null|string      
     */      
    public static function publicEncrypt($data = '')     
    {          
        if (!is_string($data)) {              
            return null;          
        }          
        return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null;      
    }      
  
    /**      
     * 私钥解密      
     * @param string $encrypted      
     * @return null      
     */      
    public static function privDecrypt($encrypted = '')      
    {          
        if (!is_string($encrypted)) {              
            return null;          
        }          
        return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null;      
    }      
  
    /**      
     * 公钥解密      
     * @param string $encrypted      
     * @return null      
     */      
    public static function publicDecrypt($encrypted = '')      
    {          
        if (!is_string($encrypted)) {              
            return null;          
        }          
    return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;      
    }  
}

测试:

require_once "Rsa.php";  
$rsa = new Rsa();  
$data['name'] = 'Tom';  
$data['age']  = '20';  
$privEncrypt = $rsa->privEncrypt(json_encode($data));  
echo '私钥加密后:'.$privEncrypt.'<br>';  
  
$publicDecrypt = $rsa->publicDecrypt($privEncrypt);  
echo '公钥解密后:'.$publicDecrypt.'<br>';  
  
$publicEncrypt = $rsa->publicEncrypt(json_encode($data));  
echo '公钥加密后:'.$publicEncrypt.'<br>';  
  
$privDecrypt = $rsa->privDecrypt($publicEncrypt);  
echo '私钥解密后:'.$privDecrypt.'<br>';


点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
6766
获赞与收藏
195

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消