PHP封装的非对称加密RSA算法示例


Posted in PHP onMay 28, 2018

本文实例讲述了PHP封装的非对称加密RSA算法。分享给大家供大家参考,具体如下:

将php的openssl扩展中的非对称加密函数封装成一个Rsa类。

需要注意的是,在windows上,需要打开openssl的配置文件,请参照官方的openssl扩展安装文档。

在windows上安装openssl扩展

1、将php路径下的两个库文件libeay32.dll和ssleay32.dll复制到操作system32下

2、配置openssl配置文件的位置,在php的路径下,有文件extras/openssl/openssl.cnf,添加环境变量OPENSSL_CONF指向这个文件的全路径。如何添加环境变量请google搜索之。

3、在php.ini里添加一行extension=php_openssl.dll

使用的demo:

//====================demo=======================
//以下是一个简单的测试demo,如果不需要请删除
$rsa = new Rsa('sslkey'); //sslkey为存放密钥的路径,将已有的密钥文件复制到该路径下,公钥名称为pub.key,私钥名称为priv.key
$rsa->createKey(); //创建一对密钥,如果密钥对已经存在,不需调用
//私钥加密,公钥解密
echo 'source:三水点靠木<br />';
$pre = $rsa->privEncrypt('三水点靠木');
echo 'private encrypted:<br />' . $pre . '<br />';
$pud = $rsa->pubDecrypt($pre);
echo 'public decrypted:' . $pud . '<br />';
//公钥加密,私钥解密
echo 'source:干IT的<br />';
$pue = $rsa->pubEncrypt('干IT的');
echo 'public encrypt:<br />' . $pue . '<br />';
$prd = $rsa->privDecrypt($pue);
echo 'private decrypt:' . $prd;
//========================demo======================

本示例在windows7、php 5.2.14、openssl 0.98下开发

<?php
/**
 * 使用openssl实现非对称加密
 *
 */
class Rsa
{
  /**
   * private key
   */
    private $_privKey;
    /**
     * public key
     */
    private $_pubKey;
    /**
     * the keys saving path
     */
    private $_keyPath;
    /**
     * the construtor,the param $path is the keys saving path
     */
    public function __construct($path)
    {
        if(empty($path) || !is_dir($path)){
            throw new Exception('Must set the keys save path');
        }
        $this->_keyPath = $path;
    }
    /**
     * create the key pair,save the key to $this->_keyPath
     */
    public function createKey()
    {
        $r = openssl_pkey_new();
        openssl_pkey_export($r, $privKey);
        file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
        $this->_privKey = openssl_pkey_get_private($privKey);
        $rp = openssl_pkey_get_details($r);
        $pubKey = $rp['key'];
        file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);
        $this->_pubKey = openssl_pkey_get_public($pubKey);
    }
    /**
     * setup the private key
     */
    public function setupPrivKey()
    {
        if(is_resource($this->_privKey)){
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
        $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 . 'pub.key';
        $puk = file_get_contents($file);
        $this->_pubKey = openssl_pkey_get_public($puk);
        return true;
    }
    /**
     * encrypt with the private key
     */
    public function privEncrypt($data)
    {
        if(!is_string($data)){
            return null;
        }
        $this->setupPrivKey();
        $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
        if($r){
            return base64_encode($encrypted);
        }
        return null;
    }
    /**
     * decrypt with the private key
     */
    public function privDecrypt($encrypted)
    {
        if(!is_string($encrypted)){
            return null;
        }
        $this->setupPrivKey();
        $encrypted = base64_decode($encrypted);
        $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
        if($r){
            return $decrypted;
        }
        return null;
    }
    /**
     * encrypt with public key
     */
    public function pubEncrypt($data)
    {
        if(!is_string($data)){
            return null;
        }
        $this->setupPubKey();
        $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
        if($r){
            return base64_encode($encrypted);
        }
        return null;
    }
    /**
     * decrypt with the public key
     */
    public function pubDecrypt($crypted)
    {
        if(!is_string($crypted)){
            return null;
        }
        $this->setupPubKey();
        $crypted = base64_decode($crypted);
        $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
        if($r){
            return $decrypted;
        }
        return null;
    }
    public function __destruct()
    {
        @ fclose($this->_privKey);
        @ fclose($this->_pubKey);
    }
}
PHP 相关文章推荐
php实现的简单压缩英文字符串的代码
Apr 24 PHP
php设计模式 Visitor 访问者模式
Jun 28 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
PHP程序漏洞产生的原因分析与防范方法说明
Mar 06 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
php简单实现多维数组排序的方法
Sep 30 PHP
PHP new static 和 new self详解
Feb 19 PHP
PHP实现的简单异常处理类示例
May 04 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
关于PHP求解三数之和问题详析
Nov 09 PHP
PHP 实现重载
Mar 09 PHP
PHP使用QR Code生成二维码实例
Jul 07 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 #PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 #PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 #PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 #PHP
PHP排序二叉树基本功能实现方法示例
May 26 #PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 #PHP
PHP ADODB实现事务处理功能示例
May 25 #PHP
You might like
php模板之Phpbean的目录结构
2008/01/10 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
python3 反射的四种基本方法解析
2019/08/26 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
python 实现list或string按指定分段
2019/12/25 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
运动会入场式解说词
2014/02/18 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
暑假安全保证书
2015/02/28 职场文书
兴趣班停课通知
2015/04/24 职场文书
离婚上诉状范文
2015/05/23 职场文书
暖春观后感
2015/06/08 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
浅谈JS的原型和原型链
2021/06/04 Javascript
Python的三个重要函数详解
2022/01/18 Python
Python制作表白爱心合集
2022/01/22 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python