|
对php RAS加密类代码感兴趣的小伙伴,下面一起跟随脚本之家 jb51.cc的小编两巴掌来看看吧! 通过openssl实现的签名、验签、非对称加解密,需要配合x.509证书(如crt和pem)文件使用。
由于各种原因,该类并不十分完善,欢迎各种测试!
/**
* php RAS加密类代码
*
* @param
* @arrange 512-笔记网: 512Pic.com
**/
<?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,$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,$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,$this->priKey,$padding)){
$ret = $rev ? rtrim(strrev($result),"
|