php rsa 加密,解密,签名,验签详解


Posted in PHP onDecember 06, 2016

php rsa 加密,解密,签名,验签

由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用。

以下php版本是适用于对接java接口,java适用密钥再php语言使用是需要添加

-----BEGIN CERTIFICATE-----
 
-----END CERTIFICATE-----

使用密钥:
加密公钥  public_key.cer

解密私钥  private_key.key

签名私钥 sign_key.key

验签公钥 verify.cer

<?php
class RSAUtils{
  //加密公钥
  function redPukey()
  {    
    //拼接加密公钥路径
    $encryptionKeyPath="D:/encryptions.cer";   
    $encryptionKey4Server = file_get_contents($encryptionKeyPath);

    $pem = chunk_split(base64_encode($encryptionKey4Server),64,"\n");//转换为pem格式的公钥
    $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
    $publicKey = openssl_pkey_get_public($pem);
    return $publicKey;
  }
  
  //解密私钥
  function redPikey()
  {    
    //拼接解密私钥路径
    $decryptKeyPath="D:/decrypts.key";   
    $decryptKey4Server = file_get_contents($decryptKeyPath);

    $pem = chunk_split($decryptKey4Server,64,"\n");//转换为pem格式的私钥
    $pem = "-----BEGIN PRIVATE KEY-----\n".$pem."-----END PRIVATE KEY-----\n";
    $privateKey = openssl_pkey_get_private($pem);
    return $privateKey;
  }
  
  //签名私钥
  function redSignkey()
  {    
    //拼接签名路径
    $signKeyPath="D:/DEMO/sign.key";
    $signKey4Server = file_get_contents($signKeyPath);

    $pem = chunk_split($signKey4Server,64,"\n");//转换为pem格式的私钥
    $pem = "-----BEGIN PRIVATE KEY-----\n".$pem."-----END PRIVATE KEY-----\n";
    $signKey = openssl_pkey_get_private($pem);
    return $signKey;
  }
  
  //验签公钥
  function redVerifykey()
  {    
    //拼接验签路径
    $verifyKeyPath="D:/DEMO/verify.cer";  
    $verifyKey4Server = file_get_contents($verifyKeyPath);

    $pem = chunk_split(base64_encode($verifyKey4Server),64,"\n");//转换为pem格式的公钥
    $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
    $verifyKey = openssl_pkey_get_public($pem);
    return $verifyKey;
  }
  
  //公钥加密
  function pubkeyEncrypt($source_data, $pu_key) {
    $data = "";
    $dataArray = str_split($source_data, 117);
    foreach ($dataArray as $value) {
      $encryptedTemp = ""; 
      openssl_public_encrypt($value,$encryptedTemp,$pu_key);//公钥加密
      $data .= base64_encode($encryptedTemp);
    }
    return $data;
  }
  
  //私钥解密
  function pikeyDecrypt($eccryptData,$decryptKey) {
    $decrypted = "";
    $decodeStr = base64_decode($eccryptData);
    $enArray = str_split($decodeStr, 256);

    foreach ($enArray as $va) {
      openssl_private_decrypt($va,$decryptedTemp,$decryptKey);//私钥解密
      $decrypted .= $decryptedTemp;
    }
    return $decrypted;
  }
  
 
}
?>

注意:

有时候用base64_encode加密后,以GET的形式传到其他页面,用base64_decode解密的时候,出现乱码.

 遇到这个问题的时候,我就纳闷了,为什么有一些能正确解密,但是有一些却出现乱码呢?

后来经过检查,发现有一些中文字符,用GET形式传过来的时候,+号会被替换成空格.

为了防止出现乱码的情况,我做了一步替换,然后再解密,果然,乱码的问题,不复存在了!

比如你以GET的形式传过来一个oid变量,那么解密还原的时候,先用+号替换空格.那么输出就正常了.

如下: $oid=base64_decode(str_replace(" ","+",$_GET[oid]));

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
PHP批量生成缩略图的代码
Jul 19 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
phpnow php探针环境检测代码
Nov 04 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
基于PHP实现数据分页显示功能
May 26 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
PHP工厂模式的日常使用
Mar 20 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
php中namespace及use用法分析
Dec 06 #PHP
PHP实现的统计数据功能详解
Dec 06 #PHP
php+ajax简单实现全选删除的方法
Dec 06 #PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 #PHP
thinkPHP中volist标签用法示例
Dec 06 #PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 #PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 #PHP
You might like
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
javascript 操作文件 实现方法小结
2009/07/02 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
python设定并获取socket超时时间的方法
2019/01/12 Python
Python理解递归的方法总结
2019/01/28 Python
numpy.random模块用法总结
2019/05/27 Python
python根据文本生成词云图代码实例
2019/11/15 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
软件售后服务方案
2014/05/29 职场文书
白莲教口号
2014/06/18 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
教师节标语大全
2014/10/07 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
长江七号观后感
2015/06/11 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
人民币使用说明书
2019/04/17 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS