PHP封装ssl非对称加密算法

来源:互联网 发布:js中currenttarget 编辑:程序博客网 时间:2024/06/06 13:24
<?phpclass 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(){$privateKeyFile = $this->_keyPath . '/' . 'priv.key';$publicKeyFile = $this->_keyPath . '/' .  'pub.key';if (file_exists($privateKeyFile) && file_exists($publicKeyFile)){return true;}// 创建私钥文件$r = openssl_pkey_new();openssl_pkey_export($r, $privKey);file_put_contents($privateKeyFile, $privKey);$this->_privKey = openssl_pkey_get_private($privKey);// 创建公钥文件$rp = openssl_pkey_get_details($r);$pubKey = $rp['key'];file_put_contents($this->_keyPath . '/' .  '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 . '/' . '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 . '/' .  '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);}}// 加密文件存放路径$path = '/home/wanghu/project/test/ssl_key';$rsa = new Rsa($path);//创建一对密钥$rsa->createKey();/* 私钥加密、公钥解密 */$privateStr  = 'i am hoh, i come from shanghai!';echo 'source: ' . $privateStr . '<br />';// 生成私钥加密串$pre = $rsa->privEncrypt($privateStr);echo 'private encrypted:<br />' . $pre . '<br />';// 使用公钥解密$pud = $rsa->pubDecrypt($pre);echo 'public decrypted:' . $pud . '<br />';/* 公钥加密、私钥解密 */$publicStr = 'i am happy, are you happy?';echo 'public source:' . $publicStr . '<br />';// 生成公钥加密字符串$pubEncrypyStr = $rsa->pubEncrypt($publicStr);echo 'public encrypted:<br />' . $pubEncrypyStr . '<br />';// 使用私钥解密$prd = $rsa->privDecrypt($pubEncrypyStr);echo 'private decrypted:' . $prd . '<br />';

1 0