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

  1. <?php
  2. /**
  3. * RSA算法类
  4. * 签名及密文编码:base64字符串/十六进制字符串/二进制字符串流
  5. * 填充方式: PKCS1Padding(加解密)/NOPadding(解密)
  6. *
  7. * Notice:Only accepts a single block. Block size is equal to the RSA key size!
  8. * 如密钥长度为1024 bit,则加密时数据需小于128字节,加上PKCS1Padding本身的11字节信息,所以明文需小于117字节
  9. *
  10. * @author: linvo
  11. * @version: 1.0.0
  12. * @date: 2013/1/23
  13. */
  14. class RSA{
  15.  
  16. private $pubKey = null;
  17. private $priKey = null;
  18.  
  19. /**
  20. * 自定义错误处理
  21. */
  22. private function _error($msg){
  23. die('RSA Error:' . $msg); //TODO
  24. }
  25.  
  26. /**
  27. * 构造函数
  28. *
  29. * @param string 公钥文件(验签和加密时传入)
  30. * @param string 私钥文件(签名和解密时传入)
  31. */
  32. public function __construct($public_key_file = '', $private_key_file = ''){
  33. if ($public_key_file){
  34. $this->_getPublicKey($public_key_file);
  35. }
  36. if ($private_key_file){
  37. $this->_getPrivateKey($private_key_file);
  38. }
  39. }
  40.  
  41. /**
  42. * 生成签名
  43. *
  44. * @param string 签名材料
  45. * @param string 签名编码(base64/hex/bin)
  46. * @return 签名值
  47. */
  48. public function sign($data, $code = 'base64'){
  49. $ret = false;
  50. if (openssl_sign($data, $ret, $this->priKey)){
  51. $ret = $this->_encode($ret, $code);
  52. }
  53. return $ret;
  54. }
  55.  
  56. /**
  57. * 验证签名
  58. *
  59. * @param string 签名材料
  60. * @param string 签名值
  61. * @param string 签名编码(base64/hex/bin)
  62. * @return bool
  63. */
  64. public function verify($data, $sign, $code = 'base64'){
  65. $ret = false;
  66. $sign = $this->_decode($sign, $code);
  67. if ($sign !== false) {
  68. switch (openssl_verify($data, $sign, $this->pubKey)){
  69. case 1: $ret = true; break;
  70. case 0:
  71. case -1:
  72. default: $ret = false;
  73. }
  74. }
  75. return $ret;
  76. }
  77.  
  78. /**
  79. * 加密
  80. *
  81. * @param string 明文
  82. * @param string 密文编码(base64/hex/bin)
  83. * @param int 填充方式(貌似php有bug,所以目前仅支持OPENSSL_PKCS1_PADDING)
  84. * @return string 密文
  85. */
  86. public function encrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING){
  87. $ret = false;
  88. if (!$this->_checkPadding($padding, 'en')) $this->_error('padding error');
  89. if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){
  90. $ret = $this->_encode($result, $code);
  91. }
  92. return $ret;
  93. }
  94.  
  95. /**
  96. * 解密
  97. *
  98. * @param string 密文
  99. * @param string 密文编码(base64/hex/bin)
  100. * @param int 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING)
  101. * @param bool 是否翻转明文(When passing Microsoft CryptoAPI-generated RSA cyphertext, revert the bytes in the block)
  102. * @return string 明文
  103. */
  104. public function decrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING, $rev = false){
  105. $ret = false;
  106. $data = $this->_decode($data, $code);
  107. if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error');
  108. if ($data !== false){
  109. if (openssl_private_decrypt($data, $result, $this->priKey, $padding)){
  110. $ret = $rev ? rtrim(strrev($result), "\0") : ''.$result;
  111. }
  112. }
  113. return $ret;
  114. }
  115.  
  116. // 私有方法
  117.  
  118. /**
  119. * 检测填充类型
  120. * 加密只支持PKCS1_PADDING
  121. * 解密支持PKCS1_PADDING和NO_PADDING
  122. *
  123. * @param int 填充模式
  124. * @param string 加密en/解密de
  125. * @return bool
  126. */
  127. private function _checkPadding($padding, $type){
  128. if ($type == 'en'){
  129. switch ($padding){
  130. case OPENSSL_PKCS1_PADDING:
  131. $ret = true;
  132. break;
  133. default:
  134. $ret = false;
  135. }
  136. } else {
  137. switch ($padding){
  138. case OPENSSL_PKCS1_PADDING:
  139. case OPENSSL_NO_PADDING:
  140. $ret = true;
  141. break;
  142. default:
  143. $ret = false;
  144. }
  145. }
  146. return $ret;
  147. }
  148.  
  149. private function _encode($data, $code){
  150. switch (strtolower($code)){
  151. case 'base64':
  152. $data = base64_encode(''.$data);
  153. break;
  154. case 'hex':
  155. $data = bin2hex($data);
  156. break;
  157. case 'bin':
  158. default:
  159. }
  160. return $data;
  161. }
  162.  
  163. private function _decode($data, $code){
  164. switch (strtolower($code)){
  165. case 'base64':
  166. $data = base64_decode($data);
  167. break;
  168. case 'hex':
  169. $data = $this->_hex2bin($data);
  170. break;
  171. case 'bin':
  172. default:
  173. }
  174. return $data;
  175. }
  176.  
  177. private function _getPublicKey($file){
  178. $key_content = $this->_readFile($file);
  179. if ($key_content){
  180. $this->pubKey = openssl_get_publickey($key_content);
  181. }
  182. }
  183.  
  184. private function _getPrivateKey($file){
  185. $key_content = $this->_readFile($file);
  186. if ($key_content){
  187. $this->priKey = openssl_get_privatekey($key_content);
  188. }
  189. }
  190.  
  191. private function _readFile($file){
  192. $ret = false;
  193. if (!file_exists($file)){
  194. $this->_error("The file {$file} is not exists");
  195. } else {
  196. $ret = file_get_contents($file);
  197. }
  198. return $ret;
  199. }
  200.  
  201. private function _hex2bin($hex = false){
  202. $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;
  203. return $ret;
  204. }
  205.  
  206. }

测试示例

  1. <?php
  2. header('Content-Type:text/html;Charset=utf-8;');
  3.  
  4. include "rsa.php";
  5.  
  6. echo '<pre>';
  7. $a = isset($_GET['a']) ? $_GET['a'] : '测试123';
  8. //////////////////////////////////////
  9. $pubfile = 'E:\ssl\cert\pwd.crt';
  10. $prifile = 'E:\ssl\cert\pwd.pem';
  11.  
  12. $m = new RSA($pubfile, $prifile);
  13. $x = $m->sign($a);
  14. $y = $m->verify($a, $x);
  15. var_dump($x, $y);
  16.  
  17. $x = $m->encrypt($a);
  18. $y = $m->decrypt($x);
  19. var_dump($x, $y);

php RAS加密类代码的更多相关文章

  1. C# RAS 非对称加密类 支持长字符串

    /// <summary> /// ikmb@163.com /// </summary> public class MyRAS { /// <summary> / ...

  2. .NET MD5加密解密代码

    MD5简介: 是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是MD2.MD4还是MD5,它们都需要获 ...

  3. PHP的AES加密类

    PHP的AES加密类 aes.php <?php /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  4. php实现aes加密类

    php实现的aes加密类,代码中有使用方法. <?php //php aes加密类 class AESMcrypt { public $iv = null; public $key = null ...

  5. php加密类

    1.需求 了解php加密类的使用 2.例子 参考ci的3.1.2的新版加密类,一个不传参,用默认加密算法,加密模式的例子 //0.加载加密类 $this->load->library('e ...

  6. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  7. netbeans中实体类代码的bug

    用了netbeans中实体类代码后,忽然报错: com.sun.tools.javac.code.Symbol$CompletionFailure: 找不到sun.util.logging.Platf ...

  8. Scala 深入浅出实战经典 第63讲:Scala中隐式类代码实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. php分页类代码带分页样式效果(转)

    php分页类代码,有漂亮的分页样式风格 时间:2016-03-16 09:16:03来源:网络 导读:不错的php分页类代码,将类文件与分页样式嵌入,实现php查询结果的精美分页,对研究php分页原理 ...

随机推荐

  1. Python对于CSV文件的读取与写入

    今天天气"刚刚好"(薛之谦么么哒),无聊的我翻到了一篇关于csv文件读取与写入的帖子,作为测试小白的我一直对python情有独钟,顿时心血来潮,决定小搞他一下,分享给那些需要的小白 ...

  2. swift 之xib自定义view可视化到storyboard

    首先直入正题:@IBInspectable & @IBDesignable 对于 @IBInspectable 和 @IBDesignable 可详见官方文档 : Creating a Cus ...

  3. 4天精通arcgis

    真是掉进了一个史无前例的坑 --ArcGIS产品线为用户提供一个可伸缩的,全面的GIS平台. 这是百科的介绍,简单来讲,这就是一个地图,可以搞事情. 学的是ArcGIS API for JavaScr ...

  4. JS框架设计读书笔记之-核心模块

    随笔记录一下读书心得 1. 框架模块-核心模块 该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码. 模块的功能主要是:对象扩展.数组化.类型判定.事件绑定和解绑.无冲突处理.模块加载 ...

  5. window10下的eclipse用java连接hadoop执行mapreduce任务

    一.准备工作 1.eclipse连接hadoop的插件,需要版本匹配,这有几个常用的 2 版本的插件 hadoop2x-eclipse-plugin-master 密码:feg1 2.hadoop-c ...

  6. 【转载】以Java的视角来聊聊SQL注入

    以Java的视角来聊聊SQL注入 原创 2017-08-08 javatiku Java面试那些事儿 在大二就接触过sql注入,之前一直在学习windows逆向技术,认为web安全以后不是自己的从业方 ...

  7. ssh秘钥分发错误“/usr/bin/ssh-copy-id: ERROR: No identities found”

    在做ssh的时候出现下面的错误,这个错误根本没有遇到过啊,仔细一看,后面的端口不对,我要发到的服务器端口是22,我想肯定是这个原因,结果不加端口,还是提示 这个错误,于是咨询下其他人,结果发现要分发的 ...

  8. Icon font font face

    font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6:   ...

  9. JavaScript系列----正则表达式

    1.正则表达式 1.1.正则表达式的类型 正则表达式在JavaScript中,提供了一种内置的构造函数--RegExp. 正则表达式有三种匹配模式: g: 表示全局模式,即模式应用于所有的字符串,而非 ...

  10. .Net中各种不同的对象创建方式的速度差异

    在.Net中,微软给我们提供了很多不同的创建对象实例的方法,它们的速度又各有不同,以下一一列举. 使用new关键字 这在.Net中是最常见,也是速度最快的方式:                     ...