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