php 实现RIJNDAEL_128加密(CBC模式,PKCS7填充)

为了不好的记性

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);
    }

}


由于使用的128算法,所以iv的size是16位,因此可以输入16位字符作为iv向量而无须再mcrypt_create_iv。同时为了兼容C#,使用了padding pkcs7作为对内容的补充。

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

你可能感兴趣的:(php 实现RIJNDAEL_128加密(CBC模式,PKCS7填充))