<?php 
 | 
/** 
 | 
 * PhalApi_Crypt_Mcrypt 原始mcrypt加密 
 | 
 *  
 | 
 * 使用mcrypt扩展进加解密 
 | 
 * 
 | 
 * <br>使用示例:<br> 
 | 
``` 
 | 
 *  $mcrypt = new PhalApi_Crypt_Mcrypt('12345678'); 
 | 
 * 
 | 
 *  $data = 'dogstar love php'; 
 | 
 *  $key = 'secrect'; 
 | 
 * 
 | 
 *  // 加密 
 | 
 *  $encryptData = $mcrypt->encrypt($data, $key); 
 | 
 * 
 | 
 *  // 解密 
 | 
 *  $decryptData = $mcrypt->decrypt($encryptData, $key); 
 | 
``` 
 | 
 * 
 | 
 * @package     PhalApi\Crypt 
 | 
 * @link        http://php.net/manual/zh/function.mcrypt-generic.php 
 | 
 * @license     http://www.phalapi.net/license GPL 协议 
 | 
 * @link        http://www.phalapi.net/ 
 | 
 * @author      dogstar <chanzonghuang@gmail.com> 2014-12-10 
 | 
 */ 
 | 
  
 | 
class PhalApi_Crypt_Mcrypt implements PhalApi_Crypt { 
 | 
  
 | 
    /** 
 | 
     * @var string $iv 加密向量, 最大长度不得超过PhalApi_Crypt_Mcrypt::MAX_IV_SIZE 
 | 
     */ 
 | 
    protected $iv; 
 | 
  
 | 
    /** 
 | 
     * @var int 最大加密向量长度 
 | 
     */ 
 | 
    const MAX_IV_SIZE = 8; 
 | 
     
 | 
    /** 
 | 
     * @var int 最大加密key的长度 
 | 
     */ 
 | 
    const MAX_KEY_LENGTH = 56; 
 | 
  
 | 
    /** 
 | 
     * @param string $iv 加密的向量 最大长度不得超过 MAX_IV_SIZE 
 | 
     */ 
 | 
    public function __construct($iv = '********') { 
 | 
        $this->iv = str_pad($iv, static::MAX_IV_SIZE, '*'); 
 | 
        if (strlen($this->iv) > static::MAX_IV_SIZE) { 
 | 
            $this->iv = substr($this->iv, 0, static::MAX_IV_SIZE); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 对称加密  
 | 
     * 
 | 
     * @param string $data 待加密的数据 
 | 
     * @param string key 私钥 
 | 
     * @return string 加密后的数据 
 | 
     */ 
 | 
    public function encrypt($data, $key) { 
 | 
        if ($data === '') { 
 | 
            return $data; 
 | 
        } 
 | 
  
 | 
        $cipher = $this->createCipher($key); 
 | 
  
 | 
        $encrypted = mcrypt_generic($cipher, $data); 
 | 
  
 | 
        $this->clearCipher($cipher); 
 | 
  
 | 
        return $encrypted; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 对称解密 
 | 
     * 
 | 
     * @see PhalApi_Crypt_Mcrypt::encrypt() 
 | 
     *  
 | 
     * @param string $data 待解密的数据 
 | 
     * @param string key 私钥 
 | 
     * @return string 解密后的数据 
 | 
     */ 
 | 
    public function decrypt($data, $key) { 
 | 
        if ($data === '') { 
 | 
            return $data; 
 | 
        } 
 | 
  
 | 
        $cipher = $this->createCipher($key); 
 | 
  
 | 
        $decrypted = mdecrypt_generic($cipher, $data); 
 | 
  
 | 
        $this->clearCipher($cipher); 
 | 
  
 | 
        return rtrim($decrypted, "\0"); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 创建cipher 
 | 
     * @param string $key 私钥 
 | 
     * @return resource 
 | 
     * @throws PhalApi_Exception_InternalServerError 
 | 
     */ 
 | 
    protected function createCipher($key) { 
 | 
        $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, ''); 
 | 
  
 | 
        if ($cipher === FALSE || $cipher < 0) { 
 | 
            throw new PhalApi_Exception_InternalServerError( 
 | 
                T('mcrypt_module_open with {cipher}', array('cipher' => $cipher)) 
 | 
            ); 
 | 
        } 
 | 
  
 | 
        mcrypt_generic_init($cipher, $this->formatKey($key), $this->iv); 
 | 
  
 | 
        return $cipher; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 格式化私钥 
 | 
     * @param string $key 私钥 
 | 
     */ 
 | 
    protected function formatKey($key) { 
 | 
        return strlen($key) > static::MAX_KEY_LENGTH ?  substr($key, 0, static::MAX_KEY_LENGTH) : $key; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 释放cipher 
 | 
     * @param resource $cipher 
 | 
     */ 
 | 
    protected function clearCipher($cipher) { 
 | 
        mcrypt_generic_deinit($cipher); 
 | 
        mcrypt_module_close($cipher); 
 | 
    } 
 | 
} 
 |