php 實現RIJNDAEL_128加密(CBC模式,PKCS7填充)

爲了避免好的記性 html

class AESMcrypt{ 算法


    /**
     * 設置默認的加密key
     * @var str
     */
    public static $defaultKey = "";  

    /**
     * 設置默認加密向量
     * @var str
     */
    private $iv = '';
    
    /**
     * 設置加密算法
     * @var str
     */
    private $cipher;
    
    /**
     * 設置加密模式
     * @var str
     */
    private $mode;
    
    public function __construct($cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC){
        $this->cipher = $cipher;
        $this->mode = $mode;
    }
    
    /**
     * 對內容加密,注意此加密方法中先對內容使用padding pkcs7,而後再加密。
     * @param str $content    須要加密的內容
     * @return str 加密後的密文
     */
    public function encrypt($content){
        if(empty($content)){
            return null;
        }
        $srcdata = $content;
        $block_size = mcrypt_get_block_size($this->cipher, $this->mode);
        $padding_char = $block_size - (strlen($content) % $block_size);
        $srcdata .= str_repeat(chr($padding_char),$padding_char);
        return mcrypt_encrypt($this->cipher, $this->getSecretKey(), $srcdata, $this->mode, $this->iv);
    }   

    /**
     * 對內容解密,注意此加密方法中先對內容解密。再對解密的內容使用padding pkcs7去除特殊字符。
     * @param String $content    須要解密的內容
     * @return String 解密後的內容
     */
    public function decrypt($content){
        if(empty($content)){
            return null;
        }

        $content = mcrypt_decrypt($this->cipher, $this->getSecretKey(), $content, $this->mode, $this->iv);
        $block = mcrypt_get_block_size($this->cipher, $this->mode);
        $pad = ord($content[($len = strlen($content)) - 1]);
        return substr($content, 0, strlen($content) - $pad);
    }

} this


因爲使用的128算法,因此iv的size是16位,所以能夠輸入16位字符做爲iv向量而無須再mcrypt_create_iv。同時爲了兼容C#,使用了padding pkcs7做爲對內容的補充。 加密

另外補充一篇同類的文章:http://blog.sina.com.cn/s/blog_40e1ba640100scu7.html spa

相關文章
相關標籤/搜索