//index.php
<?php
//需要配置PHP.INI文件,打开extension=php_openssl.dll
include 'rsaclass.php';
//以下是一个简单的测试demo,如果不需要请删除
$rsa = new Rsa('D:\......\rsa'); //放项目的PHP目录
//私钥加密,公钥解密
echo 'source:Testing:Hello World!<br />';
$pre = $rsa->privEncrypt('Testing:Hello World!');
echo 'Private Encrypted:' . $pre . '<br />';
$pud = $rsa->pubDecrypt($pre);
echo 'Public Decrypted:' . $pud . '<br />';
//公钥加密,私钥解密
echo 'source:working in here!<br />';
$pue = $rsa->pubEncrypt('working in here!');
echo 'Public Encrypt:' . $pue . '<br />';
$prd = $rsa->privDecrypt($pue);
echo 'Private Decrypt:' . $prd;
?>
//rsaclass.php
<?php
/**
* 使用openssl实现非对称加密
*/
class Rsa{   
    private $_privKey;        /*** private key*/ 
    private $_pubKey;        /*** public key*/ 
    private $_keyPath;        /*** the keys saving path*/
 
    /**
    * 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 . 'key.pem', $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.pem', $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 . 'key.pem';
        $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.pem';
        $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){
php实例代码解密        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);
    }
}
?>
加密使用 公钥, 解密使用 私钥
签名使用 私钥, 验证使用 公钥
私钥 可以导出 公钥
产生私钥 指定位数1024 公钥指数e, 通常是3, 17, 65537
$ openssl genrsa -out priv.key 1024
Generating RSA private key, 1024 bit long modulus
…..++++++
…++++++
e is 65537 (0×10001)
取出公钥
$ openssl rsa -in priv.key -pubout -out pub.key 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。