[转]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加密解密签名与验证 ...
随机推荐
- docker重命名镜像
一.docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
- Storm1.0.3集群部署
Storm集群部署 所有集群部署的基本流程都差不多:下载安装包并上传.解压安装包并配置环境变量.修改配置文件.分发安装包.启动集群.查看集群是否部署成功. 1.所有的集群上都要配置hosts vi ...
- vs2010添加头文件与库文件搜索目录
1 添加头文件搜索目录 项目属性->配置属性->C/C++->常规->添加包含目录 2 添加库文件搜索 项目属性->配置属性->VC++目录->库目录
- 7-11Zombie's Treasure Chest uva12325
题意 你有一个体积为N的箱子和两种数量无限的宝物 宝物1的体积为s1 价值为v1 宝物2同理 输入均为32位带符号整数 你的任务是计算最多能带走多少价值的宝物 暴力枚举: 首先明白一点 ...
- lupgu P3950 部落冲突
题目链接 luogu P3950 部落冲突 题解 树剖线段树可以 lct还行 代码 #include<cstdio> #include<algorithm> inline in ...
- BZOJ.2660.[BJOI2012]最多的方案(DP)
题目链接 首先我们知道: 也很好理解.如果相邻两项出现在斐波那契表示法中,那它们显然可以合并. 所以我们能得到\(n\)的斐波那契表示,记\(pos[i]\)为\(n\)的斐波那契表示法中,第\(i\ ...
- BZOJ4115 : [Wf2015]Tile Cutting
设一种方案里三角形上三个点的坐标分别为$(0,0),(-a,b),(c,d)$,则得到的平行四边形的面积为$ac+bd$. 设$d(n)$为$n$的约数个数,$D$为$d$的生成函数,则答案的生成函数 ...
- error/exception/runtime exception区别
(1)java中的异常是什么? 异常指的是程序运行过程中出现的非正常情况或错误,当程序违反了语义规则时,jvm就会将出现的错误表示为一个异常抛出.在java中,一切皆对象,异常也是,它被当作一个对象, ...
- Mac应用
App Store 安装: AnappyApp: 截图软件 Snap: Dock快捷键启动 izip Unarchiver: rar解压 Dr.Cleaner:内存清理.资源监控 下载安装: C ...
- 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’
这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...