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
PHP中的正规表达式(一)
Oct 09 PHP
PHP 批量更新网页内容实现代码
Jan 05 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
PHP处理JSON字符串key缺少双引号的解决方法
Sep 16 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
解析php类的注册与自动加载
2013/07/05 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
python多线程用法实例详解
2015/01/15 Python
python中实现php的var_dump函数功能
2015/01/21 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
《我的第一本书》教学反思
2014/02/15 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
先进班组事迹材料
2014/12/25 职场文书
保洁员岗位职责
2015/02/04 职场文书
索赔员岗位职责
2015/02/15 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
python scrapy简单模拟登录的代码分析
2021/07/21 Python