You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.2 KiB
179 lines
4.2 KiB
<?php
|
|
|
|
namespace fast;
|
|
|
|
/**
|
|
* RSA签名类
|
|
*/
|
|
class Rsa
|
|
{
|
|
public $publicKey = '';
|
|
public $privateKey = '';
|
|
private $_privKey;
|
|
|
|
/**
|
|
* * private key
|
|
*/
|
|
private $_pubKey;
|
|
|
|
/**
|
|
* * public key
|
|
*/
|
|
private $_keyPath;
|
|
|
|
/**
|
|
* * the keys saving path
|
|
*/
|
|
|
|
/**
|
|
* * the construtor,the param $path is the keys saving path
|
|
* @param string $publicKey 公钥
|
|
* @param string $privateKey 私钥
|
|
*/
|
|
public function __construct($publicKey = null, $privateKey = null)
|
|
{
|
|
$this->setKey($publicKey, $privateKey);
|
|
}
|
|
|
|
/**
|
|
* 设置公钥和私钥
|
|
* @param string $publicKey 公钥
|
|
* @param string $privateKey 私钥
|
|
*/
|
|
public function setKey($publicKey = null, $privateKey = null)
|
|
{
|
|
if (!is_null($publicKey)) {
|
|
$this->publicKey = $publicKey;
|
|
}
|
|
if (!is_null($privateKey)) {
|
|
$this->privateKey = $privateKey;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* * setup the private key
|
|
*/
|
|
private function setupPrivKey()
|
|
{
|
|
if (is_resource($this->_privKey)) {
|
|
return true;
|
|
}
|
|
$pem = chunk_split($this->privateKey, 64, "\n");
|
|
$pem = "-----BEGIN PRIVATE KEY-----\n" . $pem . "-----END PRIVATE KEY-----\n";
|
|
$this->_privKey = openssl_pkey_get_private($pem);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* * setup the public key
|
|
*/
|
|
private function setupPubKey()
|
|
{
|
|
if (is_resource($this->_pubKey)) {
|
|
return true;
|
|
}
|
|
$pem = chunk_split($this->publicKey, 64, "\n");
|
|
$pem = "-----BEGIN PUBLIC KEY-----\n" . $pem . "-----END PUBLIC KEY-----\n";
|
|
$this->_pubKey = openssl_pkey_get_public($pem);
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* 构造签名
|
|
* @param string $dataString 被签名数据
|
|
* @return string
|
|
*/
|
|
public function sign($dataString)
|
|
{
|
|
$this->setupPrivKey();
|
|
$signature = false;
|
|
openssl_sign($dataString, $signature, $this->_privKey);
|
|
return base64_encode($signature);
|
|
}
|
|
|
|
/**
|
|
* 验证签名
|
|
* @param string $dataString 被签名数据
|
|
* @param string $signString 已经签名的字符串
|
|
* @return number 1签名正确 0签名错误
|
|
*/
|
|
public function verify($dataString, $signString)
|
|
{
|
|
$this->setupPubKey();
|
|
$signature = base64_decode($signString);
|
|
$flg = openssl_verify($dataString, $signature, $this->_pubKey);
|
|
return $flg;
|
|
}
|
|
|
|
public function __destruct()
|
|
{
|
|
is_resource($this->_privKey) && @openssl_free_key($this->_privKey);
|
|
is_resource($this->_pubKey) && @openssl_free_key($this->_pubKey);
|
|
}
|
|
}
|
|
|