• 技术文章 >后端开发 >php教程

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

    2016-06-07 17:22:19原创321
    复制代码 代码如下:

    /**
    * 使用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:我是老鳖
    ';
    $pre = $rsa->privEncrypt('我是老鳖');
    echo 'private encrypted:
    ' . $pre . '
    ';

    $pud = $rsa->pubDecrypt($pre);
    echo 'public decrypted:' . $pud . '
    ';

    //公钥加密,私钥解密
    echo 'source:干IT的
    ';
    $pue = $rsa->pubEncrypt('干IT的');
    echo 'public encrypt:
    ' . $pue . '
    ';

    $prd = $rsa->privDecrypt($pue);
    echo 'private decrypt:' . $prd;
    ?>


    需要注意的是apache要支持OpenSSL
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php加密算法之实现可逆加密算法和解密分享_php实例 下一篇:测试php连接mysql是否成功的代码分享_php实例
    PHP编程就业班

    相关文章推荐

    • PHP中的日期处理方法集锦_PHP教程• 在PHP中使用灵巧的体系结构_PHP教程• 抓取YAHOO股票报价的类_php技巧• PHP 模板高级篇总结_php技巧• Yii中创建自己的Widget实例_PHP

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网