PHP封装的非对称加密RSA算法示例
本文实例讲述了PHP封装的非对称加密RSA算法。分享给大家供大家参考,具体如下:
将php的openssl扩展中的非对称加密函数封装成一个Rsa类。
需要注意的是,在windows上,需要打开openssl的配置文件,请参照官方的openssl扩展安装文档。
在windows上安装openssl扩展
1、将php路径下的两个库文件libeay32.dll和ssleay32.dll复制到操作system32下
2、配置openssl配置文件的位置,在php的路径下,有文件extras/openssl/openssl.cnf,添加环境变量OPENSSL_CONF指向这个文件的全路径。如何添加环境变量请google搜索之。
3、在php.ini里添加一行extension=php_openssl.dll
使用的demo:
//====================demo=======================
//以下是一个简单的测试demo,如果不需要请删除
$rsa=newRsa('sslkey');//sslkey为存放密钥的路径,将已有的密钥文件复制到该路径下,公钥名称为pub.key,私钥名称为priv.key
$rsa->createKey();//创建一对密钥,如果密钥对已经存在,不需调用
//私钥加密,公钥解密
echo'source:毛票票
';
$pre=$rsa->privEncrypt('毛票票');
echo'privateencrypted:
'.$pre.'
';
$pud=$rsa->pubDecrypt($pre);
echo'publicdecrypted:'.$pud.'
';
//公钥加密,私钥解密
echo'source:干IT的
';
$pue=$rsa->pubEncrypt('干IT的');
echo'publicencrypt:
'.$pue.'
';
$prd=$rsa->privDecrypt($pue);
echo'privatedecrypt:'.$prd;
//========================demo======================
本示例在windows7、php5.2.14、openssl0.98下开发
_keyPath=$path;
}
/**
*createthekeypair,savethekeyto$this->_keyPath
*/
publicfunctioncreateKey()
{
$r=openssl_pkey_new();
openssl_pkey_export($r,$privKey);
file_put_contents($this->_keyPath.DIRECTORY_SEPARATOR.'priv.key',$privKey);
$this->_privKey=openssl_pkey_get_private($privKey);
$rp=openssl_pkey_get_details($r);
$pubKey=$rp['key'];
file_put_contents($this->_keyPath.DIRECTORY_SEPARATOR.'pub.key',$pubKey);
$this->_pubKey=openssl_pkey_get_public($pubKey);
}
/**
*setuptheprivatekey
*/
publicfunctionsetupPrivKey()
{
if(is_resource($this->_privKey)){
returntrue;
}
$file=$this->_keyPath.DIRECTORY_SEPARATOR.'priv.key';
$prk=file_get_contents($file);
$this->_privKey=openssl_pkey_get_private($prk);
returntrue;
}
/**
*setupthepublickey
*/
publicfunctionsetupPubKey()
{
if(is_resource($this->_pubKey)){
returntrue;
}
$file=$this->_keyPath.DIRECTORY_SEPARATOR.'pub.key';
$puk=file_get_contents($file);
$this->_pubKey=openssl_pkey_get_public($puk);
returntrue;
}
/**
*encryptwiththeprivatekey
*/
publicfunctionprivEncrypt($data)
{
if(!is_string($data)){
returnnull;
}
$this->setupPrivKey();
$r=openssl_private_encrypt($data,$encrypted,$this->_privKey);
if($r){
returnbase64_encode($encrypted);
}
returnnull;
}
/**
*decryptwiththeprivatekey
*/
publicfunctionprivDecrypt($encrypted)
{
if(!is_string($encrypted)){
returnnull;
}
$this->setupPrivKey();
$encrypted=base64_decode($encrypted);
$r=openssl_private_decrypt($encrypted,$decrypted,$this->_privKey);
if($r){
return$decrypted;
}
returnnull;
}
/**
*encryptwithpublickey
*/
publicfunctionpubEncrypt($data)
{
if(!is_string($data)){
returnnull;
}
$this->setupPubKey();
$r=openssl_public_encrypt($data,$encrypted,$this->_pubKey);
if($r){
returnbase64_encode($encrypted);
}
returnnull;
}
/**
*decryptwiththepublickey
*/
publicfunctionpubDecrypt($crypted)
{
if(!is_string($crypted)){
returnnull;
}
$this->setupPubKey();
$crypted=base64_decode($crypted);
$r=openssl_public_decrypt($crypted,$decrypted,$this->_pubKey);
if($r){
return$decrypted;
}
returnnull;
}
publicfunction__destruct()
{
@fclose($this->_privKey);
@fclose($this->_pubKey);
}
}
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
在线RSA加密/解密工具:
http://tools.jb51.net/password/rsa_encode
文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php加密方法总结》、《PHP编码与转码操作技巧汇总》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《php正则表达式用法总结》
希望本文所述对大家PHP程序设计有所帮助。