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 图片加水印与上传图片加水印php类
May 12 PHP
谷歌音乐搜索栏的提示功能php修正代码
May 09 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
浅析ThinkPHP的模板输出功能
Jul 01 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 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 应用程序安全防范技术研究
2009/09/25 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
详解Python中的strftime()方法的使用
2015/05/22 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
python常用函数详解
2016/09/13 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
python爬虫实现中英翻译词典
2019/06/25 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
益模软件Java笔试题
2012/03/27 面试题
《争吵》教学反思
2014/02/15 职场文书
心得体会的写法
2014/09/05 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers