使用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 相关文章推荐
初学者入门:细述PHP4的核心Zend
Sep 05 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
Oct 12 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
Jun 12 PHP
php动态生成版权所有信息的方法
Mar 24 PHP
PHP中is_dir()函数使用指南
May 08 PHP
php搜索文件程序分享
Oct 30 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
php+ajax实现文件切割上传功能示例
Mar 03 PHP
php与阿里云短信接口接入操作案例分析
May 27 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
php中的登陆login
2007/01/18 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
javascript入门基础之私有变量
2010/02/23 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python实现加密的方式总结
2020/01/19 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
求网格中的黑点分布
2013/11/06 面试题
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
花坛标语大全
2014/06/30 职场文书
先进党支部事迹材料
2014/12/24 职场文书
现实表现证明材料
2015/06/19 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
六年级作文之自救
2019/12/19 职场文书
JavaCV实现照片马赛克效果
2022/01/22 Java/Android