[转]php rsa加密解密实例
转自:http://blog.csdn.net/clh604/article/details/20224735
php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密
1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)
下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端
2、php中用生成的公钥、私钥进行加密解密,直接上代码
- <?php
- $private_key = '-----BEGIN RSA PRIVATE KEY-----
- MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
- TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
- Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
- AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
- 2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
- ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
- 3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
- deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
- qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
- oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
- 4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
- QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
- yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
- -----END RSA PRIVATE KEY-----';
- $public_key = '-----BEGIN PUBLIC KEY-----
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
- 3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
- Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
- 2n1vP1D+tD3amHsK7QIDAQAB
- -----END PUBLIC KEY-----';
- //echo $private_key;
- $pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
- $pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
- print_r($pi_key);echo "\n";
- print_r($pu_key);echo "\n";
- $data = "aassssasssddd";//原始数据
- $encrypted = "";
- $decrypted = "";
- echo "source data:",$data,"\n";
- echo "private key encrypt:\n";
- openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
- $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
- echo $encrypted,"\n";
- echo "public key decrypt:\n";
- openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
- echo $decrypted,"\n";
- echo "---------------------------------------\n";
- echo "public key encrypt:\n";
- openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
- $encrypted = base64_encode($encrypted);
- echo $encrypted,"\n";
- echo "private key decrypt:\n";
- openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
- echo $decrypted,"\n";
<?php
/*
* 使用openssl实现RSA非对称加密
*
* @version $Id: Rsa.php 2812 2014-08-14 08:20:19 $
*/ class Rsa
{
/**
* 私钥
*
* @var string
*/
private $_privateKey = ''; /**
* 公钥
*
* @var string
*/
private $_publicKey = ''; /**
* 设置私钥路径
*
* @param string $privateKeyPath 私钥路径
* @param string $passphrase 私钥密码
* @return void
*/
public function setPrivateKeyPath($privateKeyPath, $passphrase = '')
{
$privateKey = file_get_contents($privateKeyPath); $this->setPrivateKey($privateKey, $passphrase);
} /**
* 设置公钥路径
*
* @param string $pubicKeyPath 公钥路径
* @return void
*/
public function setPublicKeyPath($pubicKeyPath)
{
$publicKey = file_get_contents($pubicKeyPath); $this->setPublicKey($publicKey);
} /**
* 设置私钥
*
* 注意:PHP使用的是RSA原始私钥而不是PKCS8格式的私钥
*
* @param string $privateKey 私钥
* @param string $passphrase 私钥密码
* @return void
*/
public function setPrivateKey($privateKey, $passphrase = '')
{
if (strpos($privateKey, 'BEGIN RSA PRIVATE KEY') === FALSE)
{
$privateKey = chunk_split($privateKey, 64, "\n");
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . $privateKey . "-----END RSA PRIVATE KEY-----\n";
} $this->_privateKey = openssl_pkey_get_private($privateKey, $passphrase);
} /**
* 设置公钥
*
* @param string $publicKey 公钥
* @return void
*/
public function setPublicKey($publicKey)
{
if (strpos($publicKey, 'BEGIN PUBLIC KEY') === FALSE)
{
$publicKey = chunk_split($publicKey, 64, "\n");
$publicKey = "-----BEGIN PUBLIC KEY-----\n" . $publicKey . "-----END PUBLIC KEY-----\n";
} $this->_publicKey = openssl_pkey_get_public($publicKey);
} /**
* 私钥加密字符串
*
* @param string $string 待加密的字符串
* @param integer $padding 填充方式
* @return string
*/
public function privateEncrypt($string, $padding = OPENSSL_PKCS1_PADDING)
{
$crypted = '';
$result = openssl_private_encrypt($string, $crypted, $this->_privateKey, $padding);
if ($result)
{
$crypted = base64_encode($crypted);
} return $crypted;
} /**
* 公钥解密私钥加密的字符串
*
* @param string $crypted 待解密的字符串
* @param integer $padding 填充方式
* @return string
*/
public function publicDecrypt($crypted, $padding = OPENSSL_PKCS1_PADDING)
{
$decrypted = '';
$crypted = base64_decode($crypted);
$result = openssl_public_decrypt($crypted, $decrypted, $this->_publicKey, $padding); return $decrypted;
} /**
* 公钥加密字符串
*
* @param string $string 待加密的字符串
* @param integer $padding 填充方式
* @return string
*/
public function publicEncrypt($string, $padding = OPENSSL_PKCS1_PADDING)
{
$crypted = '';
$result = openssl_public_encrypt($string, $crypted, $this->_publicKey, $padding);
if ($result)
{
$crypted = base64_encode($crypted);
} return $crypted;
} /**
* 私钥解密公钥加密的字符串
*
* @param string $crypted 待解密的字符串
* @param integer $padding 填充方式
* @return string
*/
public function privateDecrypt($crypted, $padding = OPENSSL_PKCS1_PADDING)
{
$decrypted = '';
$crypted = base64_decode($crypted);
$result = openssl_private_decrypt($crypted, $decrypted, $this->_privateKey, $padding); return $decrypted;
} /**
* 私钥签名
*
* @param string $string 待签名的字符串
* @param integer $algo 签名算法
* @return string
*/
public function sign($string, $algo = OPENSSL_ALGO_SHA1)
{
$signature = ''; $result = openssl_sign($string, $signature, $this->_privateKey, $algo);
if ($result)
{
$signature = base64_encode($signature);
} return $signature;
} /**
* 公钥验证签名
*
* @param string $string 待验证的字符串
* @param string $signature 字符串的签名
* @param integer $algo 签名算法
* @return boolean
*/
public function verify($string, $signature, $algo = OPENSSL_ALGO_SHA1)
{
$signature = base64_decode($signature);
$result = openssl_verify($string, $signature, $this->_publicKey, $algo); // 1=正确 0=不正确 -1=错误
if ($result == 1)
{
return TRUE;
} return FALSE;
} /**
* 在析构函数中释放资源
*/
public function __destruct()
{
if (is_resource($this->_privateKey))
{
openssl_free_key($this->_privateKey);
} if (is_resource($this->_publicKey))
{
openssl_free_key($this->_publicKey);
}
}
}
[转]php rsa加密解密实例的更多相关文章
- php rsa加密解密实例
1.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin ...
- php rsa加密解密实例 及签名验证-自己实践
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/4/1 * Time: 1:50 */ //注意格式一 ...
- RSA 加密解密使用实例
http://www.dtmao.cc/news_show_692109.shtml 本文不讨论RSA加密解密本身,只记录使用方法及遇到的坑,RSA原理及注意事项可在网上查找. 背景:公司的一个需求, ...
- 微信小程序(17)-- RSA加密 解密 加签 验签
RSA加密 解密 加签 验签 /** * 注:区分RSA私钥的类型,有pkcs1和pkcs8.pkcs8格式的私钥主要用于Java中 pkcs1格式: -----BEGIN RSA PRIVATE K ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
随机推荐
- P1006 传纸条 多维DP
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...
- 018 HDFS中,namenode与datanode的交互
1.解释 2.启动过程 namenode需要等待给他汇报块的情况,然后namenode会给datanode一个反馈. namenode在启动的时候有一个等待的过程. 3.如果有块损坏 等待报告中,na ...
- 使用React Hooks新特性useReducer、useContext替代传统Redux高阶组件案例
当我们使用redux进行数据管理的时候,一般都是在根组件通过Provider的方式引入store,然后在每个子组件中,通过connect的方式使用高阶组件进行连接,这样造成的一个问题是,大量的高阶组件 ...
- Codeforces-1077C
title: Codeforces-1077C date: 2018-11-24 15:22:31 tags: acm 刷题 categories: Codeforces 题意 题目链接 给你一个数组 ...
- mysql where 条件中的字段有NULL值时的sql语句写法
比如你有一个sql语句联表出来之后是这样的 id name phone status 1 张三 ...
- [USACO08OCT]Watering Hole
[USACO08OCT]Watering Hole 题目大意: Farmer John 有\(n(n\le300)\)个牧场,他希望灌溉他的所有牧场.牧场编号为\(1\sim n\),要灌溉一个牧场有 ...
- [NOIp2003提高组]神经网络
OJ题号:洛谷1038 思路:拓扑排序,注意细节.1.题目中求和运算$C_i=\displaystyle{\sum_{(j,i)\in E}W_{ji}C_j-U_i}$中$U_i$在求和运算外,只要 ...
- 我希望我知道的七个JavaScript技巧
如果你是一个JavaScript新手或仅仅最近才在你的开发工作中接触它,你可能感到沮丧.所有的语言都有自己的怪癖(quirks)——但从基于强类型的服务器端语言转移过来的开发人员可能会感到困惑.我就曾 ...
- git 撤销本地修改
git checkout file 例如:git checkout app/views/carts/_index_m.html.erb 可以先用 git status 查看差异 然后 git chec ...
- Codeforces 666E Forensic Examination SAM+权值线段树
第一次做这种$SAM$带权值线段树合并的题 然而$zjq$神犇看完题一顿狂码就做出来了 $Orz$ 首先把所有串当成一个串建$SAM$ 我们对$SAM$上每个点 建一棵权值线段树 每个叶子节点表示一个 ...