转自: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. 025 Spark中的广播变量原理以及测试(共享变量是spark中第二个抽象)

    一:来源 1.说明 为啥要有这个广播变量呢. 一些常亮在Driver中定义,然后Task在Executor上执行. 如果,有多个任务在执行,每个任务需要,就会造成浪费. 二:共享变量的官网 1.官网 ...

  2. H5中canvas标签制作在线画板

    1.介绍 左键点击下移动开始画图.放开鼠标不在画图. 2.重要使用理论 query的使用: 鼠标的按下mousedown 鼠标的移动mousemove 鼠标的放开 mouseup 3.程序 <! ...

  3. mysql 事务隔离级别 详解

    问题 在工作中真实遇到的问题:用python连接mysql,查询数据,同时有别的代码在更新mysql中的数据,前者是一直是保持连接的数据库,每一分钟select一次,但第二次却查不到更新后的数据?wh ...

  4. sorted()排序详解

    sorted()排序详解     http://wiki.python.org/moin/HowTo/Sorting?highlight=%28howto%29#The_Old_Way_Using_t ...

  5. C# Socket异步实现消息发送--附带源码

    前言 看了一百遍,不如动手写一遍. Socket这块使用不是特别熟悉,之前实现是公司有对应源码改改能用. 但是不理解实现的过程和步骤,然后最近有时间自己写个demo实现看看,熟悉熟悉Socket. 网 ...

  6. ARP欺骗防御工具arpon

    ARP欺骗防御工具arpon   ARP欺骗是局域网最为常见的中人间攻击实施方式.Kali Linux提供一款专用防御工具arpon.该工具提供三种防御方式,如静态ARP防御SARPI.动态ARP防御 ...

  7. [BZOJ3757]苹果树(树上莫队)

    树上莫队共有三种写法: 1.按DFS序列分块,和普通莫队类似.常数大,不会被卡. 2.按块状树的方式分块.常数小,会被菊花图卡到O(n). 3.按[BZOJ1086]王室联邦的方式分块.常数小,不会被 ...

  8. 在Activity中响应ListView内部按钮的点击事件的两种方法

    转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在 ...

  9. Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip dfs 按位考虑

    E. Mahmoud and a xor trip 题目连接: http://codeforces.com/contest/766/problem/E Description Mahmoud and ...

  10. Codeforces Beta Round #14 (Div. 2) C. Four Segments 水题

    C. Four Segments 题目连接: http://codeforces.com/contest/14/problem/C Description Several months later A ...