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 相关文章推荐
在windows iis5下安装php4.0+mysql之我见
Oct 09 PHP
PHP strtr() 函数使用说明
Nov 21 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
php时间戳转换的示例
Mar 31 PHP
php防止用户重复提交表单
Nov 02 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
php强制下载文件函数
Aug 24 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
PHP弱类型的安全问题详细总结
Sep 25 PHP
PHP批量获取网页中所有固定种子链接的方法
Nov 18 PHP
php实现图片压缩处理
Sep 09 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
Python读取YAML文件过程详解
2019/12/30 Python
Python while true实现爬虫定时任务
2020/06/08 Python
keras的三种模型实现与区别说明
2020/07/03 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
南京某公司笔试题
2013/01/27 面试题
群众路线调研报告范文
2014/11/03 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
大学生十八大感想
2015/08/11 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
Java移除无效括号的方法实现
2021/08/07 Java/Android