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 28 PHP
php Try Catch异常测试
Mar 01 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
php二维数组转成字符串示例
Feb 17 PHP
php绘制一条弧线的方法
Jan 24 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
php实现URL加密解密的方法
Nov 17 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
实例讲解PHP页面静态化
Feb 05 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
php原生数据库分页的代码实例
Feb 18 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
angular.bind使用心得
2015/10/26 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
Python何时应该使用Lambda函数
2019/07/02 Python
Python flask框架post接口调用示例
2019/07/03 Python
python对常见数据类型的遍历解析
2019/08/27 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
Python request操作步骤及代码实例
2020/04/13 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
《姥姥的剪纸》教学反思
2014/02/25 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
实习单位评语
2014/04/26 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python