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实现框架(一)
Oct 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 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
文件上传类
2006/10/09 PHP
PHP调用三种数据库的方法(2)
2006/10/09 PHP
mysql总结之explain
2012/02/27 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
JS 对象介绍
2010/01/20 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
Vue入门之animate过渡动画效果
2018/04/08 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
python中open函数的基本用法示例
2019/09/07 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
平面设计师的工作职责
2013/11/21 职场文书
个人自荐信
2013/12/05 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
红色旅游心得体会
2014/09/03 职场文书
2015年保送生自荐信
2015/03/24 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
高中美术教学反思
2016/02/17 职场文书
Python绘画好看的星空图
2022/03/17 Python