php RAS加密类代码

来源:互联网 发布:直通车如何优化 编辑:程序博客网 时间:2024/06/09 03:00

通过openssl实现的签名、验签、非对称加解密,需要配合x.509证书(如crt和pem)文件使用。

<?php/** * RSA算法类 * 签名及密文编码:base64字符串/十六进制字符串/二进制字符串流 * 填充方式: PKCS1Padding(加解密)/NOPadding(解密) * * Notice:Only accepts a single block. Block size is equal to the RSA key size! * 如密钥长度为1024 bit,则加密时数据需小于128字节,加上PKCS1Padding本身的11字节信息,所以明文需小于117字节 * * @author: linvo * @version: 1.0.0 * @date: 2013/1/23 */class RSA{    private $pubKey = null;    private $priKey = null;    /**     * 自定义错误处理     */    private function _error($msg){        die('RSA Error:' . $msg); //TODO    }    /**     * 构造函数     *     * @param string 公钥文件(验签和加密时传入)     * @param string 私钥文件(签名和解密时传入)     */    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;    }    /**     * 验证签名     *     * @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_PKCS1_PADDING / OPENSSL_NO_PADDING)     * @param bool 是否翻转明文(When passing Microsoft CryptoAPI-generated RSA cyphertext, revert the bytes in the block)     * @return string 明文     */    public function decrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING, $rev = false){        $ret = false;        $data = $this->_decode($data, $code);        if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error');        if ($data !== false){            if (openssl_private_decrypt($data, $result, $this->priKey, $padding)){                $ret = $rev ? rtrim(strrev($result), "") : ''.$result;            }        }        return $ret;    }    // 私有方法    /**     * 检测填充类型     * 加密只支持PKCS1_PADDING     * 解密支持PKCS1_PADDING和NO_PADDING     *     * @param int 填充模式     * @param string 加密en/解密de     * @return bool     */    private function _checkPadding($padding, $type){        if ($type == 'en'){            switch ($padding){                case OPENSSL_PKCS1_PADDING:                    $ret = true;                    break;                case OPENSSL_ALGO_MD5:                    $ret = true;                    break;                default:                    $ret = false;            }        } else {            switch ($padding){                case OPENSSL_PKCS1_PADDING:                case OPENSSL_ALGO_MD5:                case OPENSSL_NO_PADDING:                    $ret = true;                    break;                default:                    $ret = false;            }        }        return $ret;    }    private function _encode($data, $code){        switch (strtolower($code)){            case 'base64':                $data = base64_encode(''.$data);                break;            case 'hex':                $data = bin2hex($data);                break;            case 'bin':            default:        }        return $data;    }    private function _decode($data, $code){        switch (strtolower($code)){            case 'base64':                $data = base64_decode($data);                break;            case 'hex':                $data = $this->_hex2bin($data);                break;            case 'bin':            default:        }        return $data;    }    private function _getPublicKey($file){        $key_content = $this->_readFile($file);        if ($key_content){            $this->pubKey = openssl_get_publickey($key_content);        }    }    private function _getPrivateKey($file){        $key_content = $this->_readFile($file);        if ($key_content){            $this->priKey = openssl_get_privatekey($key_content);        }    }    private function _readFile($file){        $ret = false;        if (!file_exists($file)){            $this->_error("The file {$file} is not exists");        } else {            $ret = file_get_contents($file);        }        return $ret;    }    private function _hex2bin($hex = false){        $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;        return $ret;    }}



示例:

header('Content-Type:text/html;Charset=utf-8;');include "RSA.php";$a = '测试123';//////////////////////////////////////$pubfile = 'rsa_public_key.pub';$prifile = 'rsa_private_key.pem';$m = new RSA($pubfile, $prifile);$x = $m->sign($a);$y = $m->verify($a, $x);var_dump($x, $y);$x = $m->encrypt($a);$y = $m->decrypt($x);var_dump($y);


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子学东西很慢怎么办 手不小心碰肿了怎么办 腿中间摩擦的疼怎么办 晚上睡觉时双腿酸胀怎么办 腿擦破皮了怎么办 快速好 宝宝腿擦破皮了怎么办 新生儿睡觉腿喜欢弯曲怎么办 孩子八个月交叉走路怎么办 胫椎引起双腿发热怎么办 婴儿头型睡扁了怎么办 膝盖抻筋了疼怎么办 小腿肚子抻筋了怎么办 后背抻筋了 很疼怎么办 运动膝盖抻着了怎么办 大腿内侧抻着了怎么办 大腿抻筋了 很疼怎么办 小腿肚子聚筋了怎么办 6个月婴儿腿弯怎么办 胳膊抻筋拉伤了怎么办 宝宝抻着了怎么办妙招 拎东西胳膊抻了怎么办 小臂一用力筋疼怎么办 摔破胳膊很痛怎么办 胳膊的筋扭伤了怎么办 小孩胳膊抻筋了怎么办 肩膀抻着了怎么办妙招 右边肩膀抻着了怎么办 胳膊因劳累很痛怎么办 宝宝胳膊摔了疼怎么办 宝宝胳膊抻筋了怎么办 孕妇胳膊筋伤了怎么办 刚进公司就怀孕怎么办 撞到胳膊麻筋了怎么办 腰抻了怎么办多久能好 腰突然抻了一下怎么办 干活抻筋了 很疼怎么办 胳膊抻筋一动就疼怎么办 肩膀受风了很疼怎么办 开空调受风了怎么办 胳膊受风了疼怎么办 孩子胳膊抻筋了怎么办