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 相关文章推荐
PHP5/ZendEngine2的改进
Oct 09 PHP
第十节--抽象方法和抽象类
Nov 16 PHP
php 数组的创建、调用和更新实现代码
Mar 09 PHP
php 魔术方法使用说明
Oct 20 PHP
PHP学习 变量使用总结
Mar 24 PHP
20个PHP常用类库小结
Sep 11 PHP
初品cakephp 入门基础
Feb 16 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
php最简单的删除目录与文件实现方法
Nov 28 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP获取真实IP及IP模拟方法解析
Nov 24 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数组无限分级数据的层级化处理代码
2012/12/29 PHP
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
jquery 选择器部分整理
2009/10/28 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
tensorflow获取变量维度信息
2018/03/10 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python文本数据处理学习笔记详解
2019/06/17 Python
简单了解python的break、continue、pass
2019/07/08 Python
OpenCV 边缘检测
2019/07/10 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
浅析Python 责任链设计模式
2020/09/11 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
幼儿园保育员岗位职责
2014/04/13 职场文书
关于责任的演讲稿
2014/05/20 职场文书
团拜会策划方案
2014/06/07 职场文书
农民工讨薪标语
2014/06/26 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
人事专员岗位职责
2015/02/03 职场文书
保管员岗位职责
2015/02/14 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
Mysql忘记密码解决方法
2022/02/12 MySQL