使用openssl实现rsa非对称加密算法示例

 这篇文章主要介绍了使用openssl实现rsa非对称加密算法的示例,大家参考使用吧

 代码如下:
<?php
/**
 * 使用openssl实现非对称加密
 * @since 2010-07-08
 */
class Rsa
{
    /**
     * private key
     */
        private $_privKey;
 
        /**
         * public key
         */
        private $_pubKey;
 
        /**
         * the keys saving path
         */
        private $_keyPath;
 
        /**
         * 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 . 'priv.key', $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.key', $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 . 'priv.key';
                $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.key';
                $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)
        {
                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);
        }
 
}
 
//以下是一个简单的测试demo,如果不需要请删除
$rsa = new Rsa('ssl-key');
 
//私钥加密,公钥解密
echo 'source:我是老鳖<br />';
$pre = $rsa->privEncrypt('我是老鳖');
echo 'private encrypted:<br />' . $pre . '<br />';
 
$pud = $rsa->pubDecrypt($pre);
echo 'public decrypted:' . $pud . '<br />';
 
//公钥加密,私钥解密
echo 'source:干IT的<br />';
$pue = $rsa->pubEncrypt('干IT的');
echo 'public encrypt:<br />' . $pue . '<br />';
 
$prd = $rsa->privDecrypt($pue);
echo 'private decrypt:' . $prd;
?>
 
 
需要注意的是apache要支持OpenSSL
 

时间: 2024-12-03 04:42:40

使用openssl实现rsa非对称加密算法示例的相关文章

使用openssl实现rsa非对称加密算法示例_php实例

复制代码 代码如下: <?php/** * 使用openssl实现非对称加密 * @since 2010-07-08 */class Rsa{    /**     * private key     */        private $_privKey;         /**         * public key         */        private $_pubKey;         /**         * the keys saving path        

php基于openssl的rsa加密解密示例_php技巧

本文实例讲述了php基于openssl的rsa加密解密.分享给大家供大家参考,具体如下: <?php $config = array( //"config" =>"D:/phpserver/Lighttpd/openssl.cnf", //'config' =>'D:/phpStudy/Lighttpd/OpenSSL.cnf', 'private_key_bits' => 1024, // Size of Key. 'private_key

RSA(非对称加密算法、公钥加密算法)

1.RSA 1 // RSA, a suite of routines for performing RSA public-key computations in 2 // JavaScript. 3 // 4 // Requires BigInt.js and Barrett.js. 5 // 6 // Copyright 1998-2005 David Shapiro. 7 // 8 // You may use, re-use, abuse, copy, and modify this c

JAVA加密算法- 非对称加密算法(DH,RSA)的详细介绍_java

非对称密码概念 1.与对称加密算法的主要差别在于,加密和解密的密钥不相同,一个公开(公钥),一个保密(私钥).主要解决了对称加密算法密钥分配管理的问题,提高了算法安全性. 2.非对称加密算法的加密.解密的效率比较低.在算法设计上,非对称加密算法对待加密的数据长度有着苛刻的要求.例如RSA算法要求待加密的数据不得大于53个字节. 3.非对称加密算法主要用于 交换对称加密算法的密钥,而非数据交换 4.java6提供实现了DH和RSA两种算法.Bouncy Castle提供了E1Gamal算法支持.除

非对称加密算法RSA使用注意事项

原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个--RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteger项目.但这点确实需要注意,如果对大于117字节的数据加密就会抛异常出来,说法还有点莫名其妙.考虑下RSA的主要用途就可以理解了,一般我们使用RSA的主要用途是进行数字签名,另外就是对"对称加密"算法的KEY和IV向量进行加密:   第二个问题,假设要对一个文本文件(比如xml文件)中的

Java中RSA非对称密钥加解密使用示例

一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法. 二.RSA的公钥.私钥的组成,以及加密.解密的公式可见于下表 三.使用方式: ① 假设A.B机器进行通信,已A机器为主: ② A首先需要用自己的私钥为发送请求数据签名,并将公钥一同发送给B

非对称加密算法-RSA算法

一.概述  1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现  2.java6支持RSA算法  3.RSA算法可以用于数据加密和数字签名  4.RSA算法相对于DES/AES等对称加密算法,他的速度要慢的多  5.总原则:公钥加密,私钥解密  /   私钥加密,公钥解密   二.模型分析 RSA算法构建密钥对简单的很,这里我们还是以甲乙双方发送数据为模型 1.甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方 2.甲方将数据用私钥进行加密,发送给乙方 3.乙方用

数据传输加密非对称加密算法以及对称算法-RSA+AES

转载:http://blog.csdn.net/chay_chan/article/details/58605605 源码:https://github.com/Javen205/IJPay 数据传输加密   在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私信息时,开发者自然会想到对其进行加密,即使传输过程中被"有心人"截取,也不会将信息泄露.对于加密算法,相信不少开发者也有所耳闻,比如MD5加密,Base64加密,DES加密,AES加密,RSA加密等等.在这里我主

漫谈iOS RSA非对称加密与解密

前言 最近公司的客户端安全性出现了严重的问题,如今这个出解决方案并自我测试验证可行性的重任落在了我的身上,学习了很多他人的文章,再经过多次讨论,最后才确定最终解决方案.笔者在这里讲讲这一经历中所需要了解的知识. iOS客户端想要加密传输数据以防被窃取,最可靠的方式莫过于使用公钥加密算法加密,使用HTTPS协议在整个传输过程中都使用了这个技术,对于未能使用HTTPS的HTTP接口,我们能否实现RSA加密呢? PHP端实现解密可参考:iOS与PHP端实现RSA非对称加密解密 提示:本篇文章只讲RSA