php rsa 非對稱加密

php rsa 加密 相關 api

  • openssl_pkey_get_private

    // 用來判斷私鑰是否可用,可用則返回 Resource id
    resource openssl_pkey_get_private(mixed key[,string passphrase = “”])

  • openssl_pkey_get_public

    // 用來判斷公鑰是否可用,可用則返回 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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章