PHP封装的非对称加密RSA算法示例
发布:smiling 来源: PHP粉丝网 添加日期:2021-09-20 15:52:33 浏览: 评论:0
本文实例讲述了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======================
- //====================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(emptyempty($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);
- }
- }
Tags: PHP封装加密 RSA算法
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)