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 相关文章推荐
一个连接两个不同MYSQL数据库的PHP程序
Oct 09 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
PHP验证码生成原理和实现
Jan 24 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
May 27 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
实现php删除链表中重复的结点
Sep 27 PHP
php的无刷新操作实现方法分析
Feb 28 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 SplObjectStorage使用实例
2015/05/12 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
layui中的switch开关实现方法
2019/09/03 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
python使用pymysql实现操作mysql
2016/09/13 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
Python Collatz序列实现过程解析
2019/10/12 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
申报职称专业技术个人的自我评价
2013/12/12 职场文书
行政办公员自我评价分享
2013/12/14 职场文书
矫正人员思想汇报
2014/01/08 职场文书
学习标兵获奖感言
2014/02/20 职场文书
公司办公室岗位职责
2014/03/19 职场文书
协议书模板
2014/04/23 职场文书
大学生求职信例文
2014/06/29 职场文书
北京天坛导游词
2015/02/12 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
餐厅开业活动方案
2019/07/08 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS