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 22 PHP
php for 循环语句使用方法详细说明
May 09 PHP
PHP STRING 陷阱原理说明
Jul 24 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
请离开include_once和require_once
Jul 18 PHP
php调用新浪短链接API的方法
Nov 08 PHP
PHP解析RSS的方法
Mar 05 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
Zend Framework常用校验器详解
Dec 09 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
php JWT在web端中的使用方法教程
Sep 06 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与SQL注入攻击[二]
2007/04/17 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
Vue动态获取width的方法
2018/08/22 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
浅谈Python peewee 使用经验
2017/10/20 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Python pandas库中的isnull()详解
2019/12/26 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
《守株待兔》教学反思
2014/03/01 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
人事经理岗位职责
2014/04/28 职场文书
实习推荐信
2014/05/10 职场文书
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python