2017-12-11php RSA 加密解密详解

您现在的位置是: 首页 > PHP技术 > php RSA 加密解密详解

434次阅读

今天被企鹅的企业付款到银行卡API中,银行卡号和用户名需要用到的RSA 加密坑到了,一顿被狂虐后,记下此文

php RSA 加密解密详解


Linux系统都自带RSA密钥生成工具openssl,下面命令操作是CentOS下执行

当php服务端与客户端交互、提供开放api、api接口对接时,通常需要对敏感的部分api数据传输进行数据加密,这样做的好处是可以增加安全性,其中RSA非对称加密就能派上用处了,

如企鹅微信公众号的企业付款到银行卡API中就有用到该技术,文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_7&index=4

一、生成私钥


openssl genrsa -out rsa_private_key.pem 1024

# 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem


二、生成公钥


openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

# 第二条生成RSA公钥文件 rsa_public_key.pem


从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android、ios等前端,或让其对接接口


运行以上两条命令后的效果图

php RSA 加密解密详解


三、php中用生成的公钥、私钥进行加密解密


私钥加密的内容能通过公钥解密(反过来亦可以)

<?php

$private_file='./rsa_private_key.pem';//rsa_private_key.pem文件目录位置
$public_file ='./rsa_public_key.pem';//rsa_public_key.pem文件目录位置

//这个函数可用来判断私钥是否是可用的
$private_key =  openssl_pkey_get_private(file_get_contents($private_file));
//这个函数可用来判断公钥是否是可用的
$public_key = openssl_pkey_get_public(file_get_contents($public_file));

if(!$private_key){
    exit('私钥不可用!');
}

if(!$public_key){
    exit('公钥不可用!');
}

$data = "我是原始数据"; //原始数据
$encrypted = "";    // 加密后的数据.用于网络中的传输.提前定义为空字符串
$decrypted = "";    // 解密后的数据,提前定义为空字符串

$is_success = openssl_private_encrypt($data,$encrypted,$private_key);  //私钥加密
if($is_success){
    //加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的,base64_encode后方便在网址中传输或者打印,否则打印为乱码
    $encrypted = base64_encode($encrypted);
    echo '私钥加密的数据:';
    var_dump($encrypted);
}else{
    exit('加密失败');
}


openssl_public_decrypt(base64_decode($encrypted),$decrypted,$public_key);//私钥加密的内容通过公钥可用解密出来
echo '公钥解密的数据';
var_dump($decrypted);


echo "<br/>---------------------------------------<br/>";

$is_success = openssl_public_encrypt($data,$encrypted,$public_key);//公钥加密
if($is_success){
    $encrypted = base64_encode($encrypted);
    echo '公钥加密的数据';
    var_dump($encrypted);
}else{
    exit('加密失败');
}


openssl_private_decrypt(base64_decode($encrypted),$decrypted,$private_key);//私钥解密
echo '私钥解密的数据';
var_dump($decrypted);


运行后效果图如下:

php RSA 加密解密详解