php rsa 加密 相关 api
-
// 用来判断私钥是否可用,可用则返回 Resource id
resource openssl_pkey_get_private(mixed key[,string passphrase = “”]) -
// 用来判断公钥是否可用,可用则返回 Resource id
resource openssl_pkey_get_public(mixed $certificate)
参数问题
其中参数 $key $certificate 有一种传递形式:容易出错
file://path/to/file.pem
// return false
// 'file:///' 多了一个 '/'
openssl_pkey_get_private('file:///E:/SAFARI_SHI/tmp/key/rsa_private_key.pem');
// 应该是两个 '//'
// resource(4) of type (OpenSSL key)
$privateKey = openssl_pkey_get_private('file://E:/SAFARI_SHI/tmp/key/rsa_private_key.pem');
// resource(4) of type (OpenSSL key)
openssl_pkey_get_private('file://E:/SAFARI_SHI/tmp/key/private_key.pem');
// --------------------------------------------------------
// return false
// 这种形式亦是错误的
openssl_pkey_get_public('key/rsa_public_key.pem');
// return false
openssl_pkey_get_public('file:///E:/SAFARI_SHI/tmp/key/rsa_public_key.pem');
// resource(5) of type (OpenSSL key)
openssl_pkey_get_public('file://E:/SAFARI_SHI/tmp/key/rsa_public_key.pem');
ps
关于私钥的话,会有两个 rsa_private_key.pem private_key.pem
我试了下,两个都可以使用
code demo
<?php
/**
* php rsa demo
* rsa 非对称加密
* 公钥、私钥对
* 私钥加密的内容能通过公钥解密(反过来亦可以)
*
* 2016-01-09 21:58:48
*/
// 这个函数可用来判断私钥是否可用,可用返回 Resource id
$privateKey = openssl_pkey_get_private('file://E:/SAFARI_SHI/tmp/key/rsa_private_key.pem');
// 这个函数可用来判断公钥是否可用,可用返回 Resource id
$publicKey = openssl_pkey_get_public('file://E:/SAFARI_SHI/tmp/key/rsa_public_key.pem');
print_r($privateKey);
echo "\n";
print_r($publicKey);
echo "\n";
// 原始数据
$data = 'aa11-22-334';
$encrypted = '';
$decrypted = '';
echo "---------------------------------------\n";
var_dump('原始数据', $data);
echo "---------------------------------------\n";
var_dump('私钥加密');
// 私钥加密
openssl_private_encrypt($data, $encrypted, $privateKey);
// 加密后的内容通常含有特殊字符,需要编码转换下
// 在网络间通过url传输时要注意base64编码是否是url安全的
$encrypted = base64_encode($encrypted);
var_dump($encrypted);
var_dump('公钥解密');
// 私钥加密的内容可通过公钥解密出来
openssl_public_decrypt(base64_decode($encrypted), $decrypted, $publicKey);
var_dump($decrypted);
echo "---------------------------------------\n";
var_dump('公钥加密');
// 公钥加密
openssl_public_encrypt($data, $encrypted, $publicKey);
$encrypted = base64_encode($encrypted);
var_dump($encrypted);
var_dump('私钥解密');
// 私钥解密
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$privateKey);
var_dump($decrypted);