php RSA 加解密实例

  1 <?php
  2 header("Content-Type: text/html;charset=utf-8");
  3 /*
  4
  5 生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)
  6
  7 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
  8
  9 openssl genrsa -out rsa_private_key.pem 1024 #生成原始 RSA私钥文件 rsa_private_key.pem
 10 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem #将原始 RSA私钥转换为 pkcs8格式
 11 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #通过私钥生成对应 RSA公钥 rsa_public_key.pem
 12
 13 */
 14 $private_key = ‘-----BEGIN RSA PRIVATE KEY-----
 15 MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
 16 TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
 17 Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
 18 AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
 19 2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
 20 ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
 21 3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
 22 deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
 23 qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
 24 oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
 25 4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
 26 QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
 27 yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
 28 -----END RSA PRIVATE KEY-----‘;
 29 $public_key = ‘-----BEGIN PUBLIC KEY-----
 30 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
 31 3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
 32 Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
 33 2n1vP1D+tD3amHsK7QIDAQAB
 34 -----END PUBLIC KEY-----‘;
 35 file_put_contents(‘public_key.txt‘, $public_key);
 36 file_put_contents(‘private_key.txt‘, $private_key);
 37
 38 /**
 39 * rsa 非对称加解密
 40 */
 41 class rsa {
 42     private $public_key = ‘‘; //公密钥
 43     private $private_key = ‘‘; //私密钥
 44     private $public_key_resource = ‘‘; //公密钥资源
 45     private $private_key_resource = ‘‘; //私密钥资源
 46     /**
 47      * 架构函数
 48      * @param [string] $public_key_file  [公密钥文件地址]
 49      * @param [string] $private_key_file [私密钥文件地址]
 50      */
 51     public function __construct($public_key_file,$private_key_file) {
 52         try {
 53             if(!file_exists($public_key_file) || !file_exists($private_key_file)) {
 54                 throw new Exception(‘key file no exists‘);
 55             }
 56             if (false == ($this->public_key = file_get_contents($public_key_file)) || false == ($this->private_key = file_get_contents($private_key_file))) {
 57                 throw new Exception(‘read key file fail‘);
 58             }
 59             if(false == ($this->public_key_resource = $this->is_bad_public_key($this->public_key)) || false == ($this->private_key_resource = $this->is_bad_private_key($this->private_key))) {
 60                 throw new Exception(‘public key or private key no usable‘);
 61             }
 62
 63         } catch (Exception $e) {
 64             die($e->getMessage());
 65         }
 66     }
 67     private function is_bad_public_key($public_key) {
 68         return openssl_pkey_get_public($public_key);
 69     }
 70     private function is_bad_private_key($private_key) {
 71         return openssl_pkey_get_private($private_key);
 72     }
 73     /**
 74      * 生成一对公私密钥 成功返回 公私密钥数组 失败 返回 false
 75      */
 76     public function create_key() {
 77         $res = openssl_pkey_new();
 78         if($res == false) return false;
 79         openssl_pkey_export($res, $private_key);
 80         $public_key = openssl_pkey_get_details($res);
 81         return array(‘public_key‘=>$public_key["key"],‘private_key‘=>$private_key);
 82     }
 83     /**
 84      * 用私密钥加密
 85      */
 86     public function private_encrypt($input) {
 87         openssl_private_encrypt($input,$output,$this->private_key_resource);
 88         return base64_encode($output);
 89     }
 90     /**
 91      * 解密 私密钥加密后的密文
 92      */
 93     public function public_decrypt($input) {
 94         openssl_public_decrypt(base64_decode($input),$output,$this->public_key_resource);
 95         return $output;
 96     }
 97     /**
 98      * 用公密钥加密
 99      */
100     public function public_encrypt($input) {
101         openssl_public_encrypt($input,$output,$this->public_key_resource);
102         return base64_encode($output);
103     }
104     /**
105      * 解密 公密钥加密后的密文
106      */
107     public function private_decrypt($input) {
108         openssl_private_decrypt(base64_decode($input),$output,$this->private_key_resource);
109         return $output;
110     }
111 }
112
113 $rsa = new rsa(‘public_key.txt‘,‘private_key.txt‘);
114
115 $str = ‘待加密字符‘;
116 $str = $rsa->public_encrypt($str); //用公密钥加密
117 echo $str,‘</br>‘;
118 $str = $rsa->private_decrypt($str); //用私密钥解密
119 echo $str,‘</br>‘;
120 //=============================================================
121 $str = $rsa->private_encrypt($str); //用丝密钥加密
122 echo $str,‘</br>‘;
123 $str = $rsa->public_decrypt($str); //用公密钥解密
124 echo $str,‘</br>‘;
时间: 2024-10-06 22:01:22

php RSA 加解密实例的相关文章

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

java rsa加解密算法的实现

RSAUtils:RSA加解密的实现 package com.rsa.test; import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import jav

PHP RSA加解密示例(转)

1.生成密钥和公钥 开始前需要准备openssl环境 linux 需要安装openssl工具包,传送门http://www.openssl.org/source/ window 下需要安装openssl的程序,传送门http://slproweb.com/products/Win32OpenSSL.html 如果不想安装,可以用本例提供的密钥和公钥进行测试. 密钥生成 openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档. openssl g

java RSA加解密以及用途

在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每次报文本身的加解密(这一般使用AES/DES加密),对于较为安全的支付通道,则一般是约定定期交换加解密密钥,交换过程本身的报文则是通过RSA进行加解密的.这样就在单纯的对称加密的基础上提供了更好的保障,只要签名复杂,定期的更新足以使得破坏的成本高昂到超过破解的成本. 一般来说,公钥会发布给客户端,客

【go语言】RSA加解密

关于go语言的RSA加解密的介绍,这里有一篇文章,已经介绍的很完整了. 对应的go语言的加解密代码,参考git. 因为原文跨语言是跟php,我这里要跟c语言进行交互,所以,这里贴上c语言的例子. 参考原文:http://hayageek.com/rsa-encryption-decryption-openssl-c/ #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/rsa.h> #i

C# 中使用 RSA加解密算法

一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的.加密算法E和解密算法D也都是公开的.虽然密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK.正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存:另一个为公开密钥

openssl - rsa加解密例程

原文链接: http://www.cnblogs.com/cswuyg/p/3187462.html openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做法是使用对称密钥加密数据,然后再把这个只在当前有效的临时生成的对称密钥用非对称密钥的公钥加密之后传递给目标方,目标方使用约定好的非对称密钥中的私钥解开,得到数据加密的密钥,再进行数据解密,得到数据,

java 使用pem密钥进行RSA加解密

1.使用openssl生成私钥和公钥 openssl下载地址:http://www.openssl.org/source openssl生成私钥命令:  genrsa -out rsa_private_key.pem 1024 openssl生成公钥命令:  rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 2.此时在openssl安装目录下的bin文件夹可以看到 rsa_private_key.pem 和 rsa_publi

RSA 加解密 秘钥对说明

rsa非对称加密, 加解密需要不同的秘钥,称作一对. rsa加解密分两种,第一:公钥加密私钥解密.第二:私钥加密公钥解密. 需要注意的是,公加私解得到的密文是变化的,而私加公解的得到的密文是固定的. 生成密匙对需要设置一个长度,常用的设置为1024,或者2048.注意,不同长度的密匙,能够加密的明文最长度是有限制的.说明如下: 1024的情况: 加密时,明文最大长度: 1024/8 - 11 = 117   ,因此需要对明文做117字节长度的分片加密,再拼接. 解密时,密文最大长度:1024/8