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 相关文章推荐
分页显示Oracle数据库记录的类之二
Oct 09 PHP
使用adodb lite解决问题
Dec 31 PHP
第五章 php数组操作
Dec 30 PHP
深入掌握include_once与require_once的区别
Jun 17 PHP
destoon二次开发常用数据库操作
Jun 21 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
php实现统计网站在线人数的方法
May 12 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 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
YII使用url组件美化管理的方法
2015/12/28 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
js序列化和反序列化的使用讲解
2019/01/19 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python re模块介绍
2014/11/30 Python
简单的Python的curses库使用教程
2015/04/11 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python实现单链表的方法示例
2019/09/03 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
小学国庆节活动方案
2014/02/11 职场文书
家长学校工作方案
2014/05/07 职场文书
护理实习生带教计划
2015/01/16 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python