代码如下
class Rsa {
private $_privKey;
private $_pubKey;
private $_keyPath;
public function __construct ($path) {
if (empty($path) || !is_dir($path)) {
throw new \Exception('Must set the keys save path');
}
$this->_keyPath = $path;
$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';
$prk = file_get_contents($file);
$this->_privKey = openssl_pkey_get_private($prk);
$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';
$puk = file_get_contents($file);
$this->_pubKey = openssl_pkey_get_public($puk);
}
public function setupPrivKey () {
if (is_resource($this->_privKey)) {
return true;
}
$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';
$prk = file_get_contents($file);
$this->_privKey = openssl_pkey_get_private($prk);
return true;
}
public function setupPubKey () {
if (is_resource($this->_pubKey)) {
return true;
}
$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';
$puk = file_get_contents($file);
$this->_pubKey = openssl_pkey_get_public($puk);
return true;
}
public function privEncrypt ($data) {
$crypto = '';
foreach (str_split($data, 117) as $chunk) {
openssl_private_encrypt($chunk, $encryptData, $this->_privKey);
$crypto .= $encryptData;
}
return base64_encode($crypto);
}
public function privDecrypt ($encrypted) {
$crypto = '';
foreach (str_split(base64_decode($encrypted), 128) as $chunk) {
openssl_private_decrypt($chunk, $decryptData, $this->_privKey);
$crypto .= $decryptData;
}
return $crypto;
}
public function pubEncrypt ($data) {
$crypto = '';
foreach (str_split($data, 117) as $chunk) {
openssl_public_encrypt($chunk, $encryptData, $this->_pubKey);
$crypto .= $encryptData;
}
return base64_encode($crypto);
return null;
}
public function pubDecrypt ($crypted) {
$crypto = '';
foreach (str_split(base64_decode($crypted), 128) as $chunk) {
openssl_public_decrypt($chunk, $decryptData, $this->_pubKey);
$crypto .= $decryptData;
}
return $crypto;
}
public function sign ($data) {
if (!is_string($data)) {
return null;
}
openssl_sign($data, $sign, $this->_privKey);
$sign = base64_encode($sign);
return $sign;
}
public function verify($data, $sign) {
if (!is_string($data)) {
return null;
}
$result = (bool)openssl_verify($data, base64_decode($sign), $this->_pubKey);
return $result;
}
public function __destruct () {
empty($this->_privKey) ? '' : openssl_free_key($this->_privKey);
empty($this->_pubKey) ? '' : openssl_free_key($this->_pubKey);
}
}
类的使用
$rsa = new Rsa(这里需要存放秘钥的路径);
$aa = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc';
echo 'source:我是wanlshop<br>';
$pre = $rsa->privEncrypt($aa);
echo '加密之后' . $pre . '<br>';
$pud = $rsa->pubDecrypt($pre);
echo '解密之后:' . $pud . '<br>';
$pue = $rsa->pubEncrypt($aa);
echo '加密:' . $pue . '<br>';
$sign = $rsa->sign($pue);
$result = $rsa->verify($pue,$sign);
var_dump($result);
$prd = $rsa->privDecrypt($pue);
echo '解密:' . $prd;