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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
一个简单的PHP入门源程序
Oct 09 PHP
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
PHP生成唯一订单号
Jul 05 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
php简单中奖算法(实例)
Aug 15 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 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用户指南-cookies部分
2006/10/09 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
PHP中的替代语法介绍
2015/01/09 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
想学python 这5本书籍你必看!
2018/12/11 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
python输出决策树图形的例子
2019/08/09 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
会计应届生的自荐信
2013/12/13 职场文书
单位单身证明范本
2014/01/11 职场文书
《搭石》教学反思
2014/04/07 职场文书
文艺演出策划方案
2014/06/07 职场文书
关于保护环境的标语
2014/06/09 职场文书
助残日活动总结
2014/08/27 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
暑假打工感想
2015/08/07 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS