热门标签 | 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,'
';

 


推荐阅读
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • 在64位Linux系统上编译GCC时,可能会遇到一个错误,即在构建共享库过程中,`.libs/alloc.o` 文件中的重定位 `R_X86_64_32` 无法应用于 `.rodata.str1.8` 段。这一问题通常与目标文件的地址空间限制有关,需要通过调整编译选项或修改源代码来解决。具体来说,可以尝试使用 `-fPIC` 选项以生成位置无关代码,或者检查相关对象文件的链接方式。 ... [详细]
  • 深入解析 ELF 文件格式与静态链接技术
    本文详细探讨了ELF文件格式及其在静态链接过程中的应用。在C/C++代码转化为可执行文件的过程中,需经过预处理、编译、汇编和链接等关键步骤。最终生成的可执行文件不仅包含系统可识别的机器码,还遵循了严格的文件结构规范,以确保其在操作系统中的正确加载和执行。 ... [详细]
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社区 版权所有