PHP基于openssl实现的非对称加密操作示例


Posted in PHP onJanuary 11, 2019

本文实例讲述了PHP基于openssl实现的非对称加密操作。分享给大家供大家参考,具体如下:

使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密。

1.安装openssl和php的openssl扩展

2.生成私钥:openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护

openssl genrsa -out rsa_private_key.pem 1024

3.生成公钥:rsa命令用于处理RSA密钥、格式转换和打印信息

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

4.这里我们使用私钥加密,公钥解密

<?php
/**
* 密钥文件的路径
*/
$privateKeyFilePath = 'rsa_private_key.pem';
/**
* 公钥文件的路径
*/
$publicKeyFilePath = 'rsa_public_key.pem';
extension_loaded('openssl') or die('php需要openssl扩展支持');
(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) or die('密钥或者公钥的文件路径不正确');
/**
* 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
*/
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
/**
* 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
*/
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
($privateKey && $publicKey) or die('密钥或者公钥不可用');
/**
* 原数据
*/
$originalData = '加密前hahahaha';
/**
* 加密以后的数据,用于在网路上传输
*/
$encryptData = '';
echo '原数据为:', $originalData, PHP_EOL;
///////////////////////////////用私钥加密////////////////////////
if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {
  /**
   * 加密后 可以base64_encode后方便在网址中传输 或者打印 否则打印为乱码
   */
  echo '加密成功,加密后数据(base64_encode后)为:', base64_encode($encryptData), PHP_EOL;
} else {
  die('加密失败');
}
///////////////////////////////用公钥解密////////////////////////
/**
* 解密以后的数据
*/
$decryptData ='';
if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
  echo '解密成功,解密后数据为:', $decryptData, PHP_EOL;
} else {
  die('解密成功');
}
PHP 相关文章推荐
用PHP实现的随机广告显示代码
Jun 14 PHP
PHP网站基础优化方法小结
Sep 29 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
php目录拷贝实现方法
Jul 10 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP类的自动加载机制实现方法分析
Jan 10 #PHP
PHP验证类的封装与使用方法详解
Jan 10 #PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
Jan 10 #PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 #PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 #PHP
PHP微信支付结果通知与回调策略分析
Jan 10 #PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 #PHP
You might like
二进制交叉权限微型php类分享
2014/02/07 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
Python导入oracle数据的方法
2015/07/10 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
快速入门python学习笔记
2017/12/06 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python dumps和loads区别详解
2020/02/04 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
化学工程专业求职信
2014/08/10 职场文书
天猫活动策划方案
2014/08/21 职场文书
超级礼物观后感
2015/06/15 职场文书
解除合同协议书范本
2016/03/21 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Python操作CSV格式文件的方法大全
2021/07/15 Python