使用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 相关文章推荐
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
解决php接收shell返回的结果中文乱码问题
Jan 23 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
PHP内存使用情况如何获取
Oct 10 PHP
微信支付PHP SDK之微信公众号支付代码详解
Dec 09 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
Apr 01 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
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
利用python获取Ping结果示例代码
2017/07/06 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
巴西手表购物网站:eclock
2019/03/19 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
学习十八大精神心得体会
2013/12/31 职场文书
信息技术课后反思
2014/04/27 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
旅游安全责任协议书
2016/03/22 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript