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

  

复制代码 代码如下:

  <?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