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数组应该有多大的分析
Jul 30 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP中的use关键字概述
Jul 23 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP使用CURL实现下载文件功能示例
Jun 03 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 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函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
js实现日历
2020/11/07 Javascript
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
详解Python3的TFTP文件传输
2018/06/26 Python
python命令行参数用法实例分析
2019/06/25 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
学生会个人自荐书范文
2014/02/12 职场文书
校园安全教育广播稿
2014/02/17 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
民事调解书范文
2015/05/20 职场文书
高一英语教学反思
2016/03/03 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python
Java 在线考试云平台的实现
2021/11/23 Java/Android
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏