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实现分页的一个示例
Oct 09 PHP
php抽奖小程序的实现代码
Jun 18 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
php中实现获取随机数组列表的自定义函数
Apr 02 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
PHP实现json_decode不转义中文的方法
May 20 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
Laravel框架学习笔记之批量更新数据功能
May 30 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 PHP
PHP实现随机发放扑克牌
Apr 21 PHP
PHP实现文件上传与下载
Aug 28 PHP
swoole锁的机制代码实例讲解
Mar 04 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检测url是否存在的方法
2015/04/14 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
vue数据双向绑定原理解析(get &amp; set)
2017/03/08 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
Python hashlib模块用法实例分析
2018/06/12 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
python递归下载文件夹下所有文件
2019/08/31 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
keras 读取多标签图像数据方式
2020/06/12 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
python Timer 类使用介绍
2020/12/28 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
Html5之title吸顶功能
2018/06/04 HTML / CSS
英语自荐信范文
2013/12/11 职场文书
大学生实习思想汇报
2014/01/12 职场文书
学校岗位设置方案
2014/01/16 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
教师廉政准则心得体会
2016/01/20 职场文书