2015-03-14 */ abstract class PhalApi_Crypt_RSA_MultiBase implements PhalApi_Crypt { /** * @var int 用户最大分割长度 */ protected $maxSplitLen; /** * @var int 允许最大分割的长度 */ const ALLOW_MAX_SPLIT_LEN = 117; /** * @param int $maxSplitLen 最大分割的彻底,应介于(0, PhalApi_Crypt_RSA_MultiBase::ALLOW_MAX_SPLIT_LEN] */ public function __construct($maxSplitLen = 0) { $this->maxSplitLen = $maxSplitLen > 0 ? min($maxSplitLen, static::ALLOW_MAX_SPLIT_LEN) : static::ALLOW_MAX_SPLIT_LEN; } /** * @param string $data 待加密的字符串,注意其他类型会强制转成字符串再处理 * @param string $key 私钥/公钥 * @return string 失败时返回NULL */ public function encrypt($data, $key) { $base64Data = base64_encode(strval($data)); $base64DataArr = str_split($base64Data, $this->getMaxSplitLen()); $encryptPieCollector = array(); foreach ($base64DataArr as $toCryptPie) { $encryptPie = $this->doEncrypt($toCryptPie, $key); if ($encryptPie === NULL) { return NULL; } $encryptPieCollector[] = base64_encode($encryptPie); } return base64_encode(json_encode($encryptPieCollector)); } /** * 具体的加密操作 * @param string $toCryptPie 待加密的片段 * @param string $key 公钥/私钥 */ abstract protected function doEncrypt($toCryptPie, $key); /** * @param string $data 待解密的字符串 * @param string $key 公钥/私钥 * @return string 失败时返回NULL */ public function decrypt($data, $key){ if ($data === NULL || $data === '') { return $data; } $encryptPieCollector = @json_decode(base64_decode($data), true); if (!is_array($encryptPieCollector)) { return NULL; } $decryptPieCollector = array(); foreach ($encryptPieCollector as $encryptPie) { $base64DecryptPie = @base64_decode($encryptPie); if ($base64DecryptPie === FALSE) { return NULL; } $decryptPie = $this->doDecrypt($base64DecryptPie, $key); if ($decryptPie === NULL) { return NULL; } $decryptPieCollector[] = $decryptPie; } $decryptData = implode('', $decryptPieCollector); $rs = @base64_decode($decryptData); return $rs !== FALSE ? $rs : NULL; } /** * 具体加密的操作 * @param string $encryptPie 待加密的片段 * @param string $key 公钥/私钥 */ abstract protected function doDecrypt($encryptPie, $key); /** * 取用户设置的取大分割长度 */ protected function getMaxSplitLen() { return $this->maxSplitLen; } }