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桌面中心(三) 修改数据库
Mar 11 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
PHP循环函数使用介绍之PHP基础入门教程
Sep 21 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
php中session使用示例
Mar 29 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 PHP
PHP 计算两个特别大的整数实例代码
May 07 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 tp验证表单与自动填充函数代码
2012/02/22 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
Web程序工作原理详解
2014/12/25 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
九种原生js动画效果
2015/11/11 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
TensorFlow实现Logistic回归
2018/09/07 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
python 递归相关知识总结
2021/03/03 Python
几道PHP的面试题
2012/05/19 面试题
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
学生会招新策划书
2014/02/14 职场文书
解除劳动合同证明书
2014/09/26 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
医生个人年度总结
2015/02/28 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书
护理自荐信
2019/05/14 职场文书
利用python做表格数据处理
2021/04/13 Python
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP