转自: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中用生成的公钥、私钥进行加密解密,直接上代码

    1. <?php
    2. $private_key = '-----BEGIN RSA PRIVATE KEY-----
    3. MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
    4. TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
    5. Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
    6. AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
    7. 2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
    8. ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
    9. 3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
    10. deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
    11. qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
    12. oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
    13. 4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
    14. QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
    15. yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
    16. -----END RSA PRIVATE KEY-----';
    17. $public_key = '-----BEGIN PUBLIC KEY-----
    18. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
    19. 3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
    20. Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
    21. 2n1vP1D+tD3amHsK7QIDAQAB
    22. -----END PUBLIC KEY-----';
    23. //echo $private_key;
    24. $pi_key =  openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
    25. $pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
    26. print_r($pi_key);echo "\n";
    27. print_r($pu_key);echo "\n";
    28. $data = "aassssasssddd";//原始数据
    29. $encrypted = "";
    30. $decrypted = "";
    31. echo "source data:",$data,"\n";
    32. echo "private key encrypt:\n";
    33. openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
    34. $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
    35. echo $encrypted,"\n";
    36. echo "public key decrypt:\n";
    37. openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
    38. echo $decrypted,"\n";
    39. echo "---------------------------------------\n";
    40. echo "public key encrypt:\n";
    41. openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
    42. $encrypted = base64_encode($encrypted);
    43. echo $encrypted,"\n";
    44. echo "private key decrypt:\n";
    45. openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
    46. 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加密解密实例的更多相关文章

  1. php rsa加密解密实例

    1.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin ...

  2. php rsa加密解密实例 及签名验证-自己实践

      <?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/4/1 * Time: 1:50 */ //注意格式一 ...

  3. RSA 加密解密使用实例

    http://www.dtmao.cc/news_show_692109.shtml 本文不讨论RSA加密解密本身,只记录使用方法及遇到的坑,RSA原理及注意事项可在网上查找. 背景:公司的一个需求, ...

  4. 微信小程序(17)-- RSA加密 解密 加签 验签

    RSA加密 解密 加签 验签 /** * 注:区分RSA私钥的类型,有pkcs1和pkcs8.pkcs8格式的私钥主要用于Java中 pkcs1格式: -----BEGIN RSA PRIVATE K ...

  5. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  6. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  7. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  8. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  9. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

随机推荐

  1. 【Java】 二叉树的遍历(递归与循环+层序遍历)

    在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...

  2. mysql排序数据

    一:order by的普通使用 1.介绍 当使用SELECT语句查询表中的数据时,结果集不按任何顺序进行排序.要对结果集进行排序,请使用ORDER BY子句. ORDER BY子句允许: 对单个列或多 ...

  3. 使用Golang开发一个本地代理

    引言 最近需要对接一个接口,人家提供了两种调用方式,第一种是基于IE浏览器的Active,第二种是动态链接库dll.我们公司的产品不支持IE,所以只能通过调用dll来完成了. 之前我已经用Java实现 ...

  4. 重读redux源码(一)

    前言 对于react技术栈的前端同学来说,redux应该是相对熟悉的.其代码之精简和设计之巧妙,一直为大家所推崇.此外redux的注释简直完美,阅读起来比较省事.原本也是强行读了通源码,现在也忘得差不 ...

  5. Eth-Trunk链路聚合配置

    Eth-Trunk概述 Eth-Trunk接口能够实现负载分担.增加带宽和提高可靠性 Eth-Trunk接口把多个物理接口捆绑成一个逻辑接口 Eth-Trunk接口的链路聚合模式 链路聚合模式 应用场 ...

  6. 决策树ID3算法--python实现

    参考: 统计学习方法>第五章决策树]   http://pan.baidu.com/s/1hrTscza 决策树的python实现     有完整程序     决策树(ID3.C4.5.CART ...

  7. [mysql] update……from……

    今天插入一条数据就像这样 limit ), , )) 然后报错: You can't specify target table 'categorys' for update in FROM claus ...

  8. 面向对象设计原则 接口分离原则(Interface Segregation Principle)

    接口隔离原则 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看出,他似乎跟SRP有许多相似之处. 是的其实ISP和SRP都是强调职责的单一性 ...

  9. js中函数的参数传递

    js中所有函数的参数传递都是按值传递,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样,基本类型值的传递如同基本类型变量的复制一样,而引用类型的值的传递则如同引用类型 ...

  10. BZOJ.4456.[ZJOI2016]旅行者(分治 Dijkstra)

    题目链接 \(Description\) 给定\(n\times m\)的带边权网格图.\(Q\)次询问从点\((x_i,y_i)\)到点\((x_j,y_j)\)的最短路. \(n\times m\ ...