热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpRSA加解密实例

1<?php2header(Content-Type:texthtml;charsetutf-8);3*45生成公钥、私钥对,私钥加密的内容能通过公钥解
  1 php
2 header("Content-Type: text/html;charset=utf-8");
3 /*
4
5 生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)
6
7 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
8
9 openssl genrsa -out rsa_private_key.pem 1024 #生成原始 RSA私钥文件 rsa_private_key.pem
10 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem #将原始 RSA私钥转换为 pkcs8格式
11 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #通过私钥生成对应 RSA公钥 rsa_public_key.pem
12
13 */
14 $private_key = '-----BEGIN RSA PRIVATE KEY-----
15 MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
16 TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
17 Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
18 AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
19 2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
20 ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
21 3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
22 deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
23 qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
24 oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
25 4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
26 QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
27 yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
28 -----END RSA PRIVATE KEY-----';
29 $public_key = '-----BEGIN PUBLIC KEY-----
30 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
31 3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
32 Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
33 2n1vP1D+tD3amHsK7QIDAQAB
34 -----END PUBLIC KEY-----';
35 file_put_contents('public_key.txt', $public_key);
36 file_put_contents('private_key.txt', $private_key);
37
38 /**
39 * rsa 非对称加解密
40 */
41 class rsa {
42 private $public_key = ''; //公密钥
43 private $private_key = ''; //私密钥
44 private $public_key_resource = ''; //公密钥资源
45 private $private_key_resource = ''; //私密钥资源
46 /**
47 * 架构函数
48 * @param [string] $public_key_file [公密钥文件地址]
49 * @param [string] $private_key_file [私密钥文件地址]
50 */
51 public function __construct($public_key_file,$private_key_file) {
52 try {
53 if(!file_exists($public_key_file) || !file_exists($private_key_file)) {
54 throw new Exception('key file no exists');
55 }
56 if (false == ($this->public_key = file_get_contents($public_key_file)) || false == ($this->private_key = file_get_contents($private_key_file))) {
57 throw new Exception('read key file fail');
58 }
59 if(false == ($this->public_key_resource = $this->is_bad_public_key($this->public_key)) || false == ($this->private_key_resource = $this->is_bad_private_key($this->private_key))) {
60 throw new Exception('public key or private key no usable');
61 }
62
63 } catch (Exception $e) {
64 die($e->getMessage());
65 }
66 }
67 private function is_bad_public_key($public_key) {
68 return openssl_pkey_get_public($public_key);
69 }
70 private function is_bad_private_key($private_key) {
71 return openssl_pkey_get_private($private_key);
72 }
73 /**
74 * 生成一对公私密钥 成功返回 公私密钥数组 失败 返回 false
75 */
76 public function create_key() {
77 $res = openssl_pkey_new();
78 if($res == false) return false;
79 openssl_pkey_export($res, $private_key);
80 $public_key = openssl_pkey_get_details($res);
81 return array('public_key'=>$public_key["key"],'private_key'=>$private_key);
82 }
83 /**
84 * 用私密钥加密
85 */
86 public function private_encrypt($input) {
87 openssl_private_encrypt($input,$output,$this->private_key_resource);
88 return base64_encode($output);
89 }
90 /**
91 * 解密 私密钥加密后的密文
92 */
93 public function public_decrypt($input) {
94 openssl_public_decrypt(base64_decode($input),$output,$this->public_key_resource);
95 return $output;
96 }
97 /**
98 * 用公密钥加密
99 */
100 public function public_encrypt($input) {
101 openssl_public_encrypt($input,$output,$this->public_key_resource);
102 return base64_encode($output);
103 }
104 /**
105 * 解密 公密钥加密后的密文
106 */
107 public function private_decrypt($input) {
108 openssl_private_decrypt(base64_decode($input),$output,$this->private_key_resource);
109 return $output;
110 }
111 }
112
113 $rsa = new rsa('public_key.txt','private_key.txt');
114
115 $str = '待加密字符';
116 $str = $rsa->public_encrypt($str); //用公密钥加密
117 echo $str,'
';
118 $str = $rsa->private_decrypt($str); //用私密钥解密
119 echo $str,'
';
120 //=============================================================
121 $str = $rsa->private_encrypt($str); //用丝密钥加密
122 echo $str,'
';
123 $str = $rsa->public_decrypt($str); //用公密钥解密
124 echo $str,'
';

 


推荐阅读
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • php将utf8转为gbk,php utf8怎么转gbk
    phputf8转gbk的方法:首先创建一个PHP示例文件;然后通过“iconv(UTF-8,gbkTRANSLIT,$str);”方法将字符串的 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
author-avatar
秋雨蒙蒙往事
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有