PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密)
php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密
先了解一下关于公钥私钥加解密的作用
一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我把2保留起来,不告诉你们,当做我的私钥,然后我告诉大家,1是我的公钥。
我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密。这样我就可以保护数据了。
我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。
二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是1,那么这种加密有什么用处呢?
但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。
三、总结
公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。
简单测试
代码:
<?php $config = array(
"digest_alg" => "sha512",
"private_key_bits" => , //字节数 512 1024 2048 4096 等 ,不能加引号,此处长度与加密的字符串长度有关系,可以自己测试一下
"private_key_type" => OPENSSL_KEYTYPE_RSA, //加密类型
);
$res = openssl_pkey_new($config); //提取私钥
openssl_pkey_export($res, $private_key); //生成公钥
$public_key = openssl_pkey_get_details($res);
// var_dump($public_key); $public_key=$public_key["key"]; //显示数据
var_dump($private_key); //私钥
var_dump($public_key); //公钥 //要加密的数据
$data = "http://www.cnblogs.com/wt645631686/";
echo '加密的数据:'.$data."\r\n"; //私钥加密后的数据
openssl_private_encrypt($data,$encrypted,$private_key); //加密后的内容通常含有特殊字符,需要base64编码转换下
$encrypted = base64_encode($encrypted);
echo "私钥加密后的数据:".$encrypted."\r\n"; //公钥解密
openssl_public_decrypt(base64_decode($encrypted), $decrypted, $public_key);
echo "公钥解密后的数据:".$decrypted,"\r\n"; //----相反操作。公钥加密
openssl_public_encrypt($data, $encrypted, $public_key);
$encrypted = base64_encode($encrypted);
echo "公钥加密后的数据:".$encrypted."\r\n"; openssl_private_decrypt(base64_decode($encrypted), $decrypted, $private_key);//私钥解密
echo "私钥解密后的数据:".$decrypted."n";
命令运行或者url请求
# php -f index.php
string() "-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANSzr5MouSpOUAEv
pCubJKB51kqHibfUv3+sfZyKchZ8tDzBtkKZmTIdHRSOz66LwMJWoq+U8Cm1v5X1
tL8NCQR73EWkcx3IBM+KOO5+hTfXJFTWep+6EL5ijEbvQ7iRVA8hXPUrZBU4jZlb
hnmC/XTyFLDrsHzxcpGj7Brp5h+lAgMBAAECgYEAyRe4fuCZby3q5bQs+i0LS8zk
lEHgKjSxd/uUJlOd2TS9ElPyBLVC6OYtgCokn1jxPMq7tFSTWlvCbfyGjbm9Mw0+
gViOQYZM9l7iwZP628dMUwKkbyo+wbbFkRYHtZy6FOaIByujV0M2nwU7d6rx5R0M
YB5nAE4EqV8CkKYDvWECQQD9wN2G/h7RJrTbYcIOlP3oxI47LQaYCxLm1/fJ54+C
Lsqi3jmygzukHE4ajDdoMe5DatOkljr7+kORVy8kQWCzAkEA1pXG4jGO3F1oRuHh
iwYkTiFDDsL2x3bDSsFEShy/ogl2d/aPoMN8gcapgbghfMJnL8PBzHo3sQdMG3T1
pxV6RwJBAK6uZRF3wEkkhx36pvcY0823+V19OmvSO7nT9Ez2bhElGvORXVCpDJaF
sbKO0dmVfbrFQFqt3H73oincRaSEqQcCQCWwowEhwTz1bxZcIFhh2MicUQHrvpqk
QoMD1THLQOF+Ff/WH74V9+13blhpdgBKyQL7uDNpGBUQ+g4sieUyAYsCQGo7jXSE
UnF15+/VQTf0pU1yZyAocQM4j3HKC+dGkkZ/ahPM0cCU0j9QDmlkJkNPzc3IadRW
eo90yANFW/Y3awk=
-----END PRIVATE KEY-----
"
string() "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUs6+TKLkqTlABL6QrmySgedZK
h4m31L9/rH2cinIWfLQ8wbZCmZkyHR0Ujs+ui8DCVqKvlPAptb+V9bS/DQkEe9xF
pHMdyATPijjufoU31yRU1nqfuhC+YoxG70O4kVQPIVz1K2QVOI2ZW4Z5gv108hSw
67B88XKRo+wa6eYfpQIDAQAB
-----END PUBLIC KEY-----
"
加密的数据:http://www.cnblogs.com/wt645631686/
私钥加密后的数据:ExLfHHqnUs/Ykna6d0sV7bxAU8WVbPrt5MPzHma+lJskT8Nwdrkoz9O7tuihHROltEgOIs6rwgDrDYYiNtqqO/Co0vd8NplikX21EPxvyjDHGpfCiYcG1eA+z3FGqQ4e0+KfgiroDIu+iQrlUfQ8z+UQX2yniRnIF/DM6Bbg4e8=
公钥解密后的数据:http://www.cnblogs.com/wt645631686/
公钥加密后的数据:QQNK+QBYgQzyHP+ez9fFC8Eo6zuLKMHuaRCfjQWSnMBY9JlntMXUEKDE/GS2mnpiwMByCyG+1l1kL/wVjFl/nwFUrhQhYYW+rgbJaWHGeRIdhqp7ixFOHZXdswCVHeDcluj2Ls/cLeo9v2lU7Y9DRgPUo+T4vudgTSTeiW4mbpw=
私钥解密后的数据:http://www.cnblogs.com/wt645631686/n
封装
<?php //生成证书
function exportOpenSSLFile(){
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => , //字节数 512 1024 2048 4096 等
"private_key_type" => OPENSSL_KEYTYPE_RSA, //加密类型
);
$res = openssl_pkey_new($config);
if ( $res == false ) return false;
openssl_pkey_export($res, $private_key);
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];
file_put_contents("./cert_public.key", $public_key);
file_put_contents("./cert_private.pem", $private_key);
openssl_free_key($res);
}
//加密解密
function authcode($string, $operation = 'E') {
$ssl_public = file_get_contents("./cert_public.key");
$ssl_private = file_get_contents("./cert_private.pem");
$pi_key = openssl_pkey_get_private($ssl_private);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$pu_key = openssl_pkey_get_public($ssl_public);//这个函数可用来判断公钥是否是可用的
if( false == ($pi_key || $pu_key) ) return '证书错误';
$data = "";
if( $operation == 'D') {
openssl_private_decrypt(base64_decode($string),$data,$pi_key);//私钥解密
} else {
openssl_public_encrypt($string, $data, $pu_key);//公钥加密
$data = base64_encode($data);
}
return $data;
}
// exportOpenSSLFile(); //生成秘钥证书
echo authcode('http://www.cnblogs.com/wt645631686/','E'); //加密
echo authcode('dBYP0fSjY1i0yM+TOaP8vwlUcCC4XvNIcWQGjNZCvajABE40wjHEUTuwauCIkqBzjCb04prcBkvsZdEO1VoBCmOOqL5CBsIm0yHjjnLHR6XaPfdcFjdsR/9oeQq2JGLMzjym/txgvxJyyl3RikjnzHvYQ4bxMS8G2ajWaHZjDSp+fddEBcDkHgPiJGfNosDtpC3FOeuK6LW9ShrjB3QD5s+hTY8iUC38+dnnhdEUGtfeF02mShC5gfxl6uGz/5LHbzDV1wvWz+ybd3axMZ5vSIlL8QDWnohYpRar1NBZhEv/QtKaV6teCI1Yj15aIvfhQYbT+K2EbakSYQ6pOHAs6gbmhMo7Gc4iD1UXl1Qr7qW8uhTDz2vek1JqFUnU9B845dWPEv3u1DKzDxjXwiqNoghtu4R1iZOBKMaykUVu6yZH/mJdJiDCwOmM3l+c8YAbCsYTH2gI5E/DE8km9Cecm8GY252s9hGqWUGm2kGZXTjRl+MAkHD4zRJIyAExwX5yiq/FpvBj6v/E32H/06/jodw22WyHuvpPi33rAgbyAyhm5MIWF90v9TyClJDOI7JOZnuTofr0W9jC55uZKoF/4rTpFTFdOtatmg5y4iIjdzQ92EioB9oa9wAKwh35IQJLzk6hY73/LpOm+vwQ+5SEiRSJNzRuOIqbc77sA53oCd8=','D'); //解密
补充:
http://web.chacuo.net/netrsakeypair这个网站,在线生成公钥和私钥
PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密)的更多相关文章
- Openssl生成RSA公私钥以及将公钥转换成C#支持的格式
Openssl生成RSA公私钥以及将公钥转换成C#支持的格式 1.RSA算法介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密.RSA ...
- Windows 下使用OpenSSL生成RSA公钥和私钥
Windows 下使用OpenSSL生成RSA公钥和私钥 (1)下载OpenSSL 可到该地址下载OpenSSL: https://www.openssl.org/source/(https://ww ...
- 在Linux下如何使用openssl生成RSA公钥和私钥对
在<Java实现RSA密钥对并在加解密.加签验签中应用的实例>中,我们有用Java代码生成RSA密钥对,其实在Linux操作系统中,用openssl也是很容易生成密钥对的. 一.如果在ub ...
- 如何使用openssl生成RSA公钥和私钥对
在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互 ...
- openssl生成RSA公钥和私钥对
在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...
- 使用openssl生成RSA公钥和私钥对
在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...
- openssl生成rsa公私钥对并在java中使用
rsa著名的非对称加密算法,具体实现我也不是很清楚,大概先要了解一下密码学,有一定基础才能去看的东东,这里就先介绍怎么使用rsa为我们服务. 首先openssl这是个集成了众多加密算法的工具,它将这一 ...
- 利用openSSL 生成RSA公钥和密钥
安装openssl for Windows. 之后开管理员控制台,打开openSSL 我的是 C:\OpenSSL-Win32\bin\openssl.exe 生成1024位的私钥,不指定的话默认20 ...
- openssl生成rsa公私钥
1.生成私钥pem, 执行命令openssl genrsa -out rsa_private_key.pem 1024 2.生成公钥,执行命令openssl rsa -in rsa_private_ ...
随机推荐
- bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...
- 【uoj7】 NOI2014—购票
http://uoj.ac/problem/7 (题目链接) 题意 给出一棵有根树,每次从一个节点出发可以买票到达它的一定范围内的祖先.问对于每一个点,到达根的最小花费是多少. Solution 右转 ...
- aws上部署zabbix3.4
三台机器 10.0.0.149 AmazonLinux2.0 zabbix-server zabbix-agent 10.0.1.61 CentOS6.9 zabbix-agent 10.0.1.11 ...
- AC自动机——多个kmp匹配
(并不能自动AC) 介绍: Aho-Corasick automaton,最经典的处理多个模式串的匹配问题. 是kmp和字典树的结合. 精髓与灵魂: ①利用trie处理多个模式串 ②引入fail指针. ...
- java回顾(项目前期的基本准备)
一. 基础回顾 1 集合 1.1 集合的类型与各自的特性 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查 ...
- JS原型继承与类的继承
我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- Java基础-SSM之mybatis快速入门篇
Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...
- shell脚本中自定义日志记录到文件
自定义日志函数和前期变量 # adirname - return absolute dirname of given file adirname() { odir=`pwd`; cd `dirname ...
- PHP魔术方法之__invoke()
将对象当作函数来使用时,会自动调用该方法. class ShowProfile extends Controller { public function __invoke($id) { return ...