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 utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
PHP中$_SERVER的详细参数与说明介绍
Oct 26 PHP
php 生成短网址原理及代码
Jan 23 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
php数组使用规则分析
Feb 27 PHP
PHP正则验证Email的方法
Jun 15 PHP
PHP实现的json类实例
Jul 28 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
PHP使用HTML5 FormData对象提交表单操作示例
Jul 02 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基本语法总结
2014/09/06 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python中的filter()函数的用法
2015/04/27 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
python实现Virginia无密钥解密
2019/03/20 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
thinkphp5 路由分发原理
2021/03/18 PHP
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
Java程序员常见面试题
2015/07/16 面试题
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
mysql主从复制的实现步骤
2021/10/24 MySQL
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA
Mysql 文件配置解析介绍
2022/05/06 MySQL