180 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?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);
 | 
						|
    }
 | 
						|
}
 |