php rsa 加密 相關 api
-
// 用來判斷私鑰是否可用,可用則返回 Resource id
resource openssl_pkey_get_private(mixedkey[,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);