使用openssl实现rsa非对称加密算法示例


Posted in PHP onJanuary 24, 2014
<?php
/**
 * 使用openssl实现非对称加密
 * @since 2010-07-08
 */
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_public($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);
        }
}
//以下是一个简单的测试demo,如果不需要请删除
$rsa = new Rsa('ssl-key');
//私钥加密,公钥解密
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;
?>

需要注意的是apache要支持OpenSSL

PHP 相关文章推荐
火车头采集器3.0采集图文教程
Mar 17 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 PHP
php设计模式 Singleton(单例模式)
Jun 26 PHP
php cli换行示例
Apr 22 PHP
PHP处理Oracle的CLOB实例
Nov 03 PHP
php如何连接sql server
Oct 16 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
Laravel中间件实现原理详解
Oct 09 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 PHP
thinkPHP5框架接口写法简单示例
Aug 05 PHP
测试php连接mysql是否成功的代码分享
Jan 24 #PHP
php实现邮件发送并带有附件
Jan 24 #PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 #PHP
php 发送带附件邮件示例
Jan 23 #PHP
php 获取页面中指定内容的实现类
Jan 23 #PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 #PHP
php 字符串压缩方法比较示例
Jan 23 #PHP
You might like
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
PHP仿盗链代码
2012/06/03 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
python机器学习库常用汇总
2017/11/15 Python
Python元字符的用法实例解析
2018/01/17 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
通过实例解析python and和or使用方法
2020/11/14 Python
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
师范毕业生求职自荐信
2013/09/25 职场文书
护理专业个人求职简历的自我评价
2013/10/13 职场文书
中学生学习生活的自我评价
2013/10/26 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
学校党员干部承诺书
2015/05/04 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers