php RAS加密类代码
通过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), "\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;
- }
- 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;
- }
- }
测试示例
- <?php
- header('Content-Type:text/html;Charset=utf-8;');
- include "rsa.php";
- echo '<pre>';
- $a = isset($_GET['a']) ? $_GET['a'] : '测试123';
- //////////////////////////////////////
- $pubfile = 'E:\ssl\cert\pwd.crt';
- $prifile = 'E:\ssl\cert\pwd.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($x, $y);
php RAS加密类代码的更多相关文章
- C# RAS 非对称加密类 支持长字符串
/// <summary> /// ikmb@163.com /// </summary> public class MyRAS { /// <summary> / ...
- .NET MD5加密解密代码
MD5简介: 是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是MD2.MD4还是MD5,它们都需要获 ...
- PHP的AES加密类
PHP的AES加密类 aes.php <?php /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
- php实现aes加密类
php实现的aes加密类,代码中有使用方法. <?php //php aes加密类 class AESMcrypt { public $iv = null; public $key = null ...
- php加密类
1.需求 了解php加密类的使用 2.例子 参考ci的3.1.2的新版加密类,一个不传参,用默认加密算法,加密模式的例子 //0.加载加密类 $this->load->library('e ...
- JSON生成c#类代码小工具
JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...
- netbeans中实体类代码的bug
用了netbeans中实体类代码后,忽然报错: com.sun.tools.javac.code.Symbol$CompletionFailure: 找不到sun.util.logging.Platf ...
- Scala 深入浅出实战经典 第63讲:Scala中隐式类代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- php分页类代码带分页样式效果(转)
php分页类代码,有漂亮的分页样式风格 时间:2016-03-16 09:16:03来源:网络 导读:不错的php分页类代码,将类文件与分页样式嵌入,实现php查询结果的精美分页,对研究php分页原理 ...
随机推荐
- Python对于CSV文件的读取与写入
今天天气"刚刚好"(薛之谦么么哒),无聊的我翻到了一篇关于csv文件读取与写入的帖子,作为测试小白的我一直对python情有独钟,顿时心血来潮,决定小搞他一下,分享给那些需要的小白 ...
- swift 之xib自定义view可视化到storyboard
首先直入正题:@IBInspectable & @IBDesignable 对于 @IBInspectable 和 @IBDesignable 可详见官方文档 : Creating a Cus ...
- 4天精通arcgis
真是掉进了一个史无前例的坑 --ArcGIS产品线为用户提供一个可伸缩的,全面的GIS平台. 这是百科的介绍,简单来讲,这就是一个地图,可以搞事情. 学的是ArcGIS API for JavaScr ...
- JS框架设计读书笔记之-核心模块
随笔记录一下读书心得 1. 框架模块-核心模块 该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码. 模块的功能主要是:对象扩展.数组化.类型判定.事件绑定和解绑.无冲突处理.模块加载 ...
- window10下的eclipse用java连接hadoop执行mapreduce任务
一.准备工作 1.eclipse连接hadoop的插件,需要版本匹配,这有几个常用的 2 版本的插件 hadoop2x-eclipse-plugin-master 密码:feg1 2.hadoop-c ...
- 【转载】以Java的视角来聊聊SQL注入
以Java的视角来聊聊SQL注入 原创 2017-08-08 javatiku Java面试那些事儿 在大二就接触过sql注入,之前一直在学习windows逆向技术,认为web安全以后不是自己的从业方 ...
- ssh秘钥分发错误“/usr/bin/ssh-copy-id: ERROR: No identities found”
在做ssh的时候出现下面的错误,这个错误根本没有遇到过啊,仔细一看,后面的端口不对,我要发到的服务器端口是22,我想肯定是这个原因,结果不加端口,还是提示 这个错误,于是咨询下其他人,结果发现要分发的 ...
- Icon font font face
font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6: ...
- JavaScript系列----正则表达式
1.正则表达式 1.1.正则表达式的类型 正则表达式在JavaScript中,提供了一种内置的构造函数--RegExp. 正则表达式有三种匹配模式: g: 表示全局模式,即模式应用于所有的字符串,而非 ...
- .Net中各种不同的对象创建方式的速度差异
在.Net中,微软给我们提供了很多不同的创建对象实例的方法,它们的速度又各有不同,以下一一列举. 使用new关键字 这在.Net中是最常见,也是速度最快的方式: ...