//index.php
<?php
//需要配置PHP.INI文件,打开extension=php_openssl.dll
include 'rsaclass.php';
//以下是一个简单的测试demo,如果不需要请删除
$rsa = new Rsa('D:\......\rsa'); //放项目的PHP目录
//私钥加密,公钥解密
echo 'source:Testing:Hello World!<br />';
$pre = $rsa->privEncrypt('Testing:Hello World!');
echo 'Private Encrypted:' . $pre . '<br />';
$pud = $rsa->pubDecrypt($pre);
echo 'Public Decrypted:' . $pud . '<br />';
//公钥加密,私钥解密
echo 'source:working in here!<br />';
$pue = $rsa->pubEncrypt('working in here!');
echo 'Public Encrypt:' . $pue . '<br />';
$prd = $rsa->privDecrypt($pue);
echo 'Private Decrypt:' . $prd;
?>
//rsaclass.php
<?php
/**
* 使用openssl实现非对称加密
*/
class Rsa{
private $_privKey; /*** private key*/
private $_pubKey; /*** public key*/
private $_keyPath; /*** the keys saving path*/
/**
* the construtor,the param $path is the keys saving path
*/
public function __construct($path){
if(empty($path) || !is_dir($path)){
throw new Exception('Must set the keys save path');
}
$this->_keyPath = $path;
}
/**
* create the key pair,save the key to $this->_keyPath
*/
public function createKey(){
$r = openssl_pkey_new();
openssl_pkey_export($r, $privKey);
file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'key.pem', $privKey);
$this->_privKey = openssl_pkey_get_public($privKey);
$rp = openssl_pkey_get_details($r);
$pubKey = $rp['key'];
file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.pem', $pubKey);
$this->_pubKey = openssl_pkey_get_public($pubKey);
}
/**
* setup the private key
*/
public function setupPrivKey(){
if(is_resource($this->_privKey)){
return true;
}
$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'key.pem';
$prk = file_get_contents($file);
$this->_privKey = openssl_pkey_get_private($prk);
return true;
}
/**
* setup the public key
*/
public function setupPubKey(){
if(is_resource($this->_pubKey)){
return true;
}
$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.pem';
$puk = file_get_contents($file);
$this->_pubKey = openssl_pkey_get_public($puk);
return true;
}
/**
* encrypt with the private key
*/
public function privEncrypt($data){
if(!is_string($data)){
return null;
}
$this->setupPrivKey();
$r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
if($r){
return base64_encode($encrypted);
}
return null;
}
/**
* decrypt with the private key
*/
public function privDecrypt($encrypted){
if(!is_string($encrypted)){
return null;
}
$this->setupPrivKey();
$encrypted = base64_decode($encrypted);
$r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
if($r){
return $decrypted;
}
return null;
}
/**
* encrypt with public key
*/
public function pubEncrypt($data){
if(!is_string($data)){
return null;
}
$this->setupPubKey();
$r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
if($r){
return base64_encode($encrypted);
}
return null;
}
/**
* decrypt with the public key
*/
public function pubDecrypt($crypted){
php实例代码解密 if(!is_string($crypted)){
return null;
}
$this->setupPubKey();
$crypted = base64_decode($crypted);
$r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
if($r){
return $decrypted;
}
return null;
}
public function __destruct(){
@ fclose($this->_privKey);
@ fclose($this->_pubKey);
}
}
?>
加密使用 公钥, 解密使用 私钥
签名使用 私钥, 验证使用 公钥
私钥 可以导出 公钥
签名使用 私钥, 验证使用 公钥
私钥 可以导出 公钥
产生私钥, 指定位数1024, 公钥指数e, 通常是3, 17, 65537
$ openssl genrsa -out priv.key 1024
Generating RSA private key, 1024 bit long modulus
…..++++++
…
$ openssl genrsa -out priv.key 1024
Generating RSA private key, 1024 bit long modulus
…..++++++
…
…++++++
e is 65537 (0×10001)
e is 65537 (0×10001)
取出公钥
$ openssl rsa -in priv.key -pubout -out pub.key
$ openssl rsa -in priv.key -pubout -out pub.key
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论