转自: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. 配置免SSH

    在要远程登录别人的服务器中生成授权标识:ssh-keygen -t rsa上传至需被免登录的服务器:scp ~/.ssh/id_rsa.pub root@xx.xx.xx.xx:/root/.ssh/ ...

  2. P2690 接苹果

    P2690 接苹果f[i][j][k]表示i=1或2,表示j时刻cow在哪棵树下j表示时刻k表示转移了k次如果当前第1棵树落苹果f[1][t][left]=max(f[1][t-1][left],f[ ...

  3. 009.KVM配置调整

    一 内存CPU调整 1.1 增大虚拟机内存 [root@kvm-host ~]# virsh shutdown vm01-centos6.8 [root@kvm-host ~]# virsh edit ...

  4. Python3 贝叶斯分类

    # -*- coding: utf-8 -*- """ Created on Tue Jan 16 20:11:07 2018 @author: markli " ...

  5. Spring框架学习——Spring的体系结构详解

    1.Spring简介 Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题.它是一个分层的JavaSE/JavaEE ...

  6. 20172330 2017-2018-1 《Java程序设计》第六周学习总结

    学号 2017-2018-2 <程序设计与数据结构>第六周学习总结 教材学习内容总结 这一章主要是对数组的学习: 数组是一种简单而功能强大的编程语言结构,用于分组和组织数据.在java中, ...

  7. STM32 TIMER DIAGRAM

  8. SSH 证书登录(实例详解)

    SSH 证书登录(实例详解) 客户端通过私钥登录 ssh 服务器 CentOS 7 SSH 使用证书登录 使用私钥 ssh 登陆 CentOS

  9. oracle dba

    http://www.oracleblog.org/category/study-note/ https://jonathanlewis.wordpress.com/ http://www.julia ...

  10. SQLPrompt_7.2.2.273〖含注册机〗(支持低版本和最高版本SQL2016+VS2015)

    SQLPrompt_7.4.1.564[含注册机](支持低版本和最高版本SQL2016+VS2015) http://download.csdn.net/detail/wozengcong/97601 ...