PHP-RSA-加密解密和签名

2016/08/08
复制加修改 手动验证下
API数据接口传输加密(防止黑户)
一般token加密(防止正常用户 此方式较简单 时间戳加字符串md5)
以下方法虽然会截获数据 但是还是加密的数据 私钥在服务器放着  只要服务器没有被黑
数据就是安全的
如果服务器被黑 什么样的加密有什么用 因为此时别人已经有了root

首先进入shell终端 三条命令 终端输入openssl

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

#openssl req -new -x509 -key private_key.pem  -out server.crt -days 365
#这个是生成ca证书的
#openssl x509 -text -in server.crt  输出证书信息
#使用ca证书 cd /etc/pki/tls/
#vim openssl.cnf

这时在你的用户根目录下生成了两个文件:公钥和私钥
ll 查看下
cat 看看

RSA私钥


$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
-----END RSA PRIVATE KEY-----';

RSA公钥

$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
2n1vP1D+tD3amHsK7QIDAQAB
-----END PUBLIC KEY-----';

$pi_key =  openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id 
$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
print_r($pi_key);echo "\n";
print_r($pu_key);echo "\n";

证书生成的进行格式化

$private_key = 'rsa_private_key.txt';
$public_key = 'rsa_public_key.txt';
$private_key = str_split(file_get_contents($private_key),64);
$public_key = str_split(file_get_contents($public_key),64);

$private_start = "-----BEGIN RSA PRIVATE KEY-----\n";
$private_key = implode("\n",$private_key);
$private_end = "-----END RSA PRIVATE KEY-----";
$private_key = $private_start.$private_key."\n".$private_end;

$public_start = "-----BEGIN PUBLIC KEY-----\n";
$public_key = implode("\n",$public_key);
$public_end = "-----END PUBLIC KEY-----";
$public_key = $public_start.$public_key."\n".$public_end;

私钥加密公钥解密


$data = “aassssasssddd”;//原始数据
$encrypted = ""; 
$decrypted = ""; 

echo "source data:",$data,"\n";

echo "private key encrypt:\n";

openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
echo $encrypted,"\n";

echo "public key decrypt:\n";

openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
echo $decrypted,"\n";

echo "---------------------------------------\n";
echo "public key encrypt:\n";

公钥加密私钥解密


openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
$encrypted = base64_encode($encrypted);
echo $encrypted,"\n";

echo "private key decrypt:\n";
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
echo $decrypted,"\n";

RSA签名


/**
 * $data待签名数据
 * 签名用商户私钥,必须是没有经过pkcs8转换的私钥
 * 最后的签名,需要用base64编码
 * return Sign签名
 */
function sign($data) {
    //读取私钥文件
    $priKey = file_get_contents('key/rsa_private_key.pem');
    //转换为openssl密钥,必须是没有经过pkcs8转换的私钥
    $res = openssl_get_privatekey($priKey);
    //调用openssl内置签名方法,生成签名$sign
    openssl_sign($data, $sign, $res);
    //释放资源
    openssl_free_key($res);
    //base64编码
    $sign = base64_encode($sign);
    return $sign;
}

RSA验签


/**
 * $data待签名数据
 * $sign需要验签的签名
 * 验签用支付宝公钥
 * return 验签是否通过 bool值
 */
function verify($data, $sign)  { 
    //读取支付宝公钥文件
    $pubKey = file_get_contents('key/alipay_public_key.pem');
    //转换为openssl格式密钥
    $res = openssl_get_publickey($pubKey);
    //调用openssl内置方法验签,返回bool值
    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
    //释放资源
    openssl_free_key($res);
    //返回资源是否成功
    return $result;
}


个人随笔

安静的等待,你若盛开,蝴蝶自来

承接高质量 网站开发 app开发 如有需要请点击About联系

@承鹏辉