PHP利用RSA加密解密
RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
密钥和公钥
开始前需要准备openssl环境
linux 需要安装openssl工具包,下载地址:http://www.openssl.org/source/
window 下需要安装openssl的程序,下载地址:http://slproweb.com/products/Win32OpenSSL.html
密钥生成
openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档。
1 |
openssl genrsa -out rsa_private_key.pem 1024 |
-out 指定生成的密钥的文件名,可以随意定义,但是最好为意义的名字,在此生成的密钥文件为 rsa_private_key.pem
在此生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。
公钥生成
Rsa命令用于处理RSA密钥、格式转换和打印信息
1 |
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem |
其中
-in filename:输入的RSA密钥文件,在此为上面生成的密钥 rsa_private_key.pem。
-pubout:设置此选项后,保存公钥值到输出文件中。
-out filename:输出文件,在此我们定义成rsa_public_key.pem
PHP用RSA加解密
开始前需要准备php openssl环境,开启PHP openssl扩展,window将php的配置文件php.ini中的
开启php_openssl.dll
extension=php_openssl.dll
下面代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?php date_default_timezone_set('PRC'); header("Content-type:text/html;charset=utf-8"); /** * date:2016-09-02 * Class encry * author phperblog.cn */ final class encry{ const PRIVARY_KEY="rsa/client_private_key.pem"; const PUBLIC_KEY="rsa/client_public_key.pem"; /** * Rsa加密 * @param string $orignData * @return string */ public function encode($orignData) { //密钥文件的路径 $privateKeyFilePath = self::PRIVARY_KEY; extension_loaded('openssl') or die('php需要openssl扩展支持'); (file_exists($privateKeyFilePath)) or die('密钥的文件路径不正确'); //生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath)); ($privateKey) or die('密钥不可用'); //加密以后的数据,用于在网路上传输 $encryptData = ''; ///////////////////////////////用私钥加密//////////////////////// if (openssl_private_encrypt($orignData, $encryptData, $privateKey)) { return $encryptData; } else { die('加密失败'); } } /** * Rsa解密 * @param string $encryptData * @return string */ public function decode($encryptData) { //公钥文件的路径 $publicKeyFilePath = self::PUBLIC_KEY; extension_loaded('openssl') or die('php需要openssl扩展支持'); (file_exists($publicKeyFilePath)) or die('公钥的文件路径不正确'); //生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath)); ($publicKey) or die('公钥不可用'); //解密以后的数据 $decryptData = ''; ///////////////////////////////用公钥解密//////////////////////// if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) { return $decryptData; } else { die('解密失败'); } } } $obj=new encry(); $str="name是phperblog.cn,密码是9you9.cn"; $result=base64_encode($obj->encode($str)); echo '加密后为:'.base64_encode($obj->encode($str)); //一般base64_encode后方便在网址中传输或者打印,否则打印为乱码 echo '<br>'; echo '解密后为:'.$obj->decode(base64_decode($result)); |
- PHP中XSS脚本攻击案例
- 35岁前必须做好十件事情