≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > PHP笔记

php RAS加密类功能实例

人气:571 时间:2018-09-22

这篇文章主要为大家详细介绍了php RAS加密类功能实例,具有一定的参考价值,可以用来参考一下。

对php RAS加密类代码感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!
通过openssl实现的签名、验签、非对称加解密,需要配合x.509证书(如crt和pem)文件使用。

由于各种原因,该类并不十分完善,欢迎各种测试!

/**
 * php RAS加密类代码
 *
 * @param 
 * @arrange 512-笔记网: q1010.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, $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), "\0") : ''.$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;  
				default:  
					$ret = false;  
			}  
		} else {  
			switch ($padding){  
				case OPENSSL_PKCS1_PADDING:  
				case OPENSSL_NO_PADDING:  
					$ret = true;  
					break;  
				default:  
					$ret = false;  
			}  
		}  
		return $ret;  
	}  
//来自5.1.2.笔.记 www.512 pic.com
	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;  
	}  
} 

 

本文来自:http://www.q1010.com/173/871-0.html

注:关于php RAS加密类功能实例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:RAS

您可能感兴趣的文章

上一篇:php上传文件并显示上传进度的简单示例
下一篇:php获取表单提交信息的简单示例
热门文章
  • PHP 写入WRITE编码为UTF8的文件示例
  • PHP 中文字符串截取函数示例:支持gb2312,gbk,big
  • PHP 简单留言板的制作示例
  • 解决Fatal error: Call to undefined function mb_convert_encoding() in错误问题
  • PHP语言基础(标记、注释、变量、数组、常量、函数)示例
  • php 生成迅雷链接的简单示例
  • php 获取短网址的实现方法
  • PHP 通用分页类的简单示例
  • PHP 使用文件方式导入导出整个MYSQL数据库的实现方法
  • php 获取MYSQL错误的简单示例
  • 最新文章
    • 解决PHP使用redis实现统计缓存MySQL压力的问题
    • php 简单的上传进度条的简单示例
    • php 给html中引用的js和css路径打上版本号的实现方法
    • php 实现计算年龄精准到年月日的实例
    • php+ajax无刷新分页的简单示例
    • 解决php+ajax无刷新上传图片的问题
    • 解决PHP生成HTML静态页面的问题
    • 解决PHP使用uniqid函数生成唯一ID的问题
    • 解决PHP防刷票的一些问题
    • 微信access_token的获取开发的实现方法

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。