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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章