PHP實(shí)現(xiàn)RSA加密類的實(shí)例解析
* RSA算法類
* 簽名及密文編碼:base64字符串/十六進(jìn)制字符串/二進(jìn)制字符串流
* 填充方式: PKCS1Padding(加解密)/NOPadding(解密)
*
* Notice:Only accepts a single block. Block size is equal to the RSA key size!
* 如密鑰長度為1024 bit,則加密時(shí)數(shù)據(jù)需小于128字節(jié),加上PKCS1Padding本身的11字節(jié)信息,所以明文需小于117字節(jié)
*
* @author: linvo
* @version: 1.0.0
* @date: 2013/1/23
*/
class RSA{
private $pubKey = null;
private $priKey = null;
/**
* 自定義錯(cuò)誤處理
*/
private function _error($msg){
die(RSA Error: . $msg); //TODO
}
/**
* 構(gòu)造函數(shù)
*
* @param string 公鑰文件(驗(yàn)簽和加密時(shí)傳入)
* @param string 私鑰文件(簽名和解密時(shí)傳入)
*/
public function __construct($public_key_file = , $private_key_file = ){
if ($public_key_file){
$this->_getPublicKey($public_key_file);
}
if ($private_key_file){
$this->_getPrivateKey($private_key_file);
}
}
/**
* 生成簽名
*
* @param string 簽名材料
* @param string 簽名編碼(base64/hex/bin)
* @return 簽名值
*/
public function sign($data, $code = base64){
$ret = false;
if (openssl_sign($data, $ret, $this->priKey)){
$ret = $this->_encode($ret, $code);
}
return $ret;
}
/**
* 驗(yàn)證簽名
*
* @param string 簽名材料
* @param string 簽名值
* @param string 簽名編碼(base64/hex/bin)
* @return bool
*/
public function verify($data, $sign, $code = base64){
$ret = false;
$sign = $this->_decode($sign, $code);
if ($sign !== false) {
switch (openssl_verify($data, $sign, $this->pubKey)){
case 1: $ret = true; break;
case 0:
case -1:
default: $ret = false;
}
}
return $ret;
}
/**
* 加密
*
* @param string 明文
* @param string 密文編碼(base64/hex/bin)
* @param int 填充方式(貌似php有bug,所以目前僅支持OPENSSL_PKCS1_PADDING)
* @return string 密文
*/
public function encrypt($data, $code = base64, $padding = OPENSSL_PKCS1_PADDING){
$ret = false;
if (!$this->_checkPadding($padding, en)) $this->_error(padding error);
if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){
$ret = $this->_encode($result, $code);
}
return $ret;
}
/**
* 解密
*
* @param string 密文
* @param string 密文編碼(base64/hex/bin)
* @param int 填充方式(OPENSSL_P
【PHP實(shí)現(xiàn)RSA加密類的實(shí)例解析】相關(guān)文章: